c++ - 重写采用继承结构的函数

标签 c++ inheritance overriding

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/

相关文章:

c# - 继承System.Timers.Timer时替换System.Timers.Timer.Elapsed事件

c++ - libnet 可以用来注入(inject) tcp 数据包/数据包修改吗?

c# - 在 C#.NET 中如何将对象修​​剪为其基础对象?

java - 'toString'在这里如何解决?

java - 通过父类(super class)引用变量访问子类成员

C++ 循环依赖和继承

java - Java中的继承和多态

c++ - 可以为数组分配初始化列表吗?

c++ - 防止重复的 pugixml::xml_node

c++ - Linux - 找到g++ lib的路径