虚函数不会覆盖到最新的继承对象
Virtual function does not overrides to latest inheriting object
我有 3 个 classes: A, B, C . B 继承自 A,C 继承自 B (所以 C 是 A 的孙子)。
每个对象都有显示文本的函数 talk(),在 A 和 B 中它是虚拟的。
让外部函数 call(A &a),通过引用获取对象 A,并调用函数谈话().
将对象 C 发送到函数,它使用 B 中的 talk() 而不是 C,甚至 B talk() 也是虚拟的。
为什么会这样?如何让它从 C?
调用版本
#include <iostream>
using namespace std;
class A {
public:
virtual void talk() = 0;
virtual void say() = 0;
};
class B : public A {
public:
virtual void talk() // Why C does not overrides this?
{ cout << "hello\n"; }
};
class C : public B {
public:
void talk (int a) // It should override B.talk();
{ cout << "bye\n";}
virtual void say() { cout << "my name\n"; }
};
void call(A &a) {
a.talk(); // Why does it call virtual talk() from B rather than from C?
a.say(); // This was found so it knows about object C
}
int main() {
C c;
call(c);
system("PAUSE");
return 0;
}
我预计 call(A &a) 如果每个 class 之间都有 virtual talk()
在您的示例中,C.talk(int)
不会覆盖 B.talk()
,因为 C.talk
将 int 作为参数,因此它是一个完全不同的函数。
您可以在函数声明后添加 override
让编译器检查它是否真的覆盖了任何东西:
class C : public B {
public:
// Here, the compiler complains because there's no talk(int) method
// That it can override
void talk (int a) override;
{ cout << "bye\n";}
virtual void say() { cout << "my name\n"; }
};
我有 3 个 classes: A, B, C . B 继承自 A,C 继承自 B (所以 C 是 A 的孙子)。
每个对象都有显示文本的函数 talk(),在 A 和 B 中它是虚拟的。
让外部函数 call(A &a),通过引用获取对象 A,并调用函数谈话().
将对象 C 发送到函数,它使用 B 中的 talk() 而不是 C,甚至 B talk() 也是虚拟的。
为什么会这样?如何让它从 C?
#include <iostream>
using namespace std;
class A {
public:
virtual void talk() = 0;
virtual void say() = 0;
};
class B : public A {
public:
virtual void talk() // Why C does not overrides this?
{ cout << "hello\n"; }
};
class C : public B {
public:
void talk (int a) // It should override B.talk();
{ cout << "bye\n";}
virtual void say() { cout << "my name\n"; }
};
void call(A &a) {
a.talk(); // Why does it call virtual talk() from B rather than from C?
a.say(); // This was found so it knows about object C
}
int main() {
C c;
call(c);
system("PAUSE");
return 0;
}
我预计 call(A &a) 如果每个 class 之间都有 virtual talk()
在您的示例中,C.talk(int)
不会覆盖 B.talk()
,因为 C.talk
将 int 作为参数,因此它是一个完全不同的函数。
您可以在函数声明后添加 override
让编译器检查它是否真的覆盖了任何东西:
class C : public B {
public:
// Here, the compiler complains because there's no talk(int) method
// That it can override
void talk (int a) override;
{ cout << "bye\n";}
virtual void say() { cout << "my name\n"; }
};