覆盖继承结构的函数

时间:2013-02-23 05:04:15

标签: c++ inheritance override

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”

1 个答案:

答案 0 :(得分:3)

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

当派生类型函数具有相同的签名(即也需要struct1*)时,它会覆盖 Base的行为但是,当签名有struct2*时,它不会覆盖,而是隐藏 Base函数。