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中的成员。“在Base中的foo”被打印出来。当Derived类函数接受struct1指针时,它会在Der中打印“foo”。但是有没有办法让它采用struct2指针并在Der中显示“foo”
答案 0 :(得分:3)
你要求的是,解释你的意思覆盖 Base::foo
的行为,将是函数的共变量参数,而这在OO中是不可能的,因为派生类型将缩小基类型的契约,因此它将打破Liskov替换原则。您将无法用Base
类型的对象替换类型Der
的对象,因为后者不接受不是struct1
对象的struct2
对象
当派生类型函数具有相同的签名(即也需要struct1*
)时,它会覆盖 Base
的行为但是,当签名有struct2*
时,它不会覆盖,而是隐藏 Base
函数。