Tôi có các lớp:C++ đa hình và mặc định luận
class Base
{
public:
virtual void foo(int x = 0)
{
printf("X = %d", x);
}
};
class Derived : public Base
{
public:
virtual void foo(int x = 1)
{
printf("X = %d", x);
}
};
Khi tôi có:
Base* bar = new Derived();
bar->foo();
đầu ra của tôi là "X = 0", ngay cả khi foo được gọi là từ nguồn gốc, nhưng khi Tôi có:
Derived* bar = new Derived();
bar->foo();
Kết quả của tôi là "X = 1". Hành vi này có đúng không? (Để chọn giá trị tham số mặc định từ kiểu khai báo, thay vì chọn nó từ kiểu đối tượng thực tế). Điều này có phá vỡ sự đa hình C++ không?
Có thể gây ra nhiều sự cố nếu ai đó sử dụng các chức năng ảo mà không chỉ định tham số chức năng thực tế và sử dụng thông số mặc định của hàm.
đặt nội dung nào đó trong printf() thực sự cho bạn biết chức năng nào đang được gọi là – Ferruccio
Rõ ràng là hàm được gọi là Derived :: foo – Felics
Làm cách nào? cả hai đều in một cái gì đó như "X = giá trị". Bạn không thể sử dụng giá trị để xác định giá trị nào đang được gọi. Hãy thử in "Base: X =% d" trong cơ sở và bạn sẽ có thể biết cái nào được gọi. – Ferruccio