以下代碼基於C++模板:完全指南的第298頁上的示例。我刪除了與我的問題無關的部分。繼承基類成員函數的虛擬說明符
class Virtual {
public:
virtual void foo() {
}
};
class Base : private Virtual {
public:
void foo() {
std::cout << "Base::foo()" << '\n';
}
};
class Derived : public Base {
public:
void foo() {
std::cout << "Derived::foo()" << '\n';
}
};
int main()
{
Base *p = new Derived;
p->foo(); // calls Derived::foo()
}
我不明白通話p->foo()
如何結束調用Derived::foo
。更具體地說,p
的靜態類型是Base*
。 Base::foo
是非虛擬的。現在,Base
私自繼承'虛擬',它有自己的foo
,看起來好像Base::foo
以某種方式從Virtual::foo
獲得virtual
說明符。這裏究竟發生了什麼?
'Base :: foo' **是虛擬的。 –
U創建了Derived的一個實例,這就是它調用Derived的方法的原因。檢查OOP繼承。 –
@KerrekSB這個問題是基於一個錯誤的假設。這發生在人們身上。清除誤解幫助了我很多。這是否應該受到懲罰? – AlwaysLearning