struct struct1
{};
struct struct2:public struct1
{};
class Base
{
public:
virtual void foo(struct1 *s)
{
cout<<"foo in Base"<<endl;
}
};
class Der:public Base
{
public:
virtual void foo(struct2 *s)
{
cout<<"Foo in Der"<<endl;
}
};
int main()
{
struct2 s;
Base *b = new Der();
b->foo(&s);
}
当我调用 main 中的函数时,它调用 Base 中的成员。“foo in Base”被打印。当派生类函数采用 struct1 指针时,它会打印“foo in Der”。但是有没有办法让它接受struct2指针并显示“foo in Der”
最佳答案
您所要求的内容,解释为您的意思是覆盖 Base::foo
的行为,将是函数的协变参数,这在面向对象中是不可能的,因为派生类型将缩小基本类型的契约,因此它将打破里氏替换原则。您将无法替换 Base
类型的对象具有 Der
类型的对象,因为后者不接受 struct1
不是 struct2
的对象对象。
当派生类型函数具有相同的签名(即也采用 struct1*
)时,它覆盖 Base
的行为然后动态调度开始。但是当你的签名有struct2*
时它不会覆盖,而是隐藏 Base
功能。
关于c++ - 重写采用继承结构的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037266/