Tôi hy vọng rằng nếu foo
được khai báo trong lớp D
, nhưng không được đánh dấu là ảo, thì mã sau sẽ gọi việc thực hiện foo
trong D
(bất kể loại động của d
).Trong C++, là một hàm tự động ảo nếu nó ghi đè một hàm ảo?
D& d = ...;
d.foo();
Tuy nhiên, trong chương trình sau, không phải như vậy. Bất cứ ai có thể giải thích điều này? Là một phương pháp tự động ảo nếu nó ghi đè lên một chức năng ảo?
#include <iostream>
using namespace std;
class C {
public:
virtual void foo() { cout << "C" << endl; }
};
class D : public C {
public:
void foo() { cout << "D" << endl; }
};
class E : public D {
public:
void foo() { cout << "E" << endl; }
};
int main(int argc, char **argv)
{
E& e = *new E;
D& d = *static_cast<D*>(&e);
d.foo();
return 0;
}
Đầu ra của chương trình trên là:
E
Các static_cast là không cần thiết - 'D & d = * static_cast (&e);' là tương đương với 'D & d = e;' do diễn viên tiềm ẩn từ E */E & đến D */D &. –
Trong C++ 11 thêm "override" vào khai báo hàm làm cho nó rõ ràng ý định của bạn để ghi đè lên hàm lớp cơ sở, nó cũng gây ra lỗi từ trình biên dịch trong trường hợp hàm mà bạn khai báo khác với constness từ base. bạn ngạc nhiên trong trường hợp bạn lấy được từ std :: exception ví dụ và khai báo what() non-const) – Ghita