2
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”被打印出来。当 Derived 类函数采用 struct1 指针时,它会打印“foo in Der”。但是有什么方法可以让它使用 struct2 指针并显示“foo in Der”

4

1 回答 1

3

你所要求的,解释你的意思是覆盖的行为Base::foo,将是函数的协变参数,这在 OO 中是不可能的,因为派生类型会缩小基类型的契约,因此它会破坏 Liskov 替换原则。您将无法用 typeBase的对象替换 type 的对象Der,因为后者不接受struct1不是对象的struct2对象。

当派生类型函数具有相同的签名(即也采用 a struct1*)时,它会覆盖的行为Base和动态调度开始。但是当你的签名有它时,struct2*它不会覆盖而是隐藏Base函数。

于 2013-02-23T05:13:10.907 回答