是否可以覆盖C++子类中的函数而不使用虚拟关键字到父类的抽象函数?

cod*_*ver 9 c++ overriding visual-c++

class Parent {
public:
    void func1(); // Complete meaningful definition in parent given.

    virtual HRESULT func2()=0;  // Bcoz of this function Parent class is abstract. 
};


class Child: public Parent {
public:
    void func1(); // Different definition in child.
};
Run Code Online (Sandbox Code Playgroud)

这在C++中是否可行?我重写func1()哪个不是虚拟的,它已经在父抽象类中有了一个定义.

ami*_*mit 21

[假设此处Child扩展Parent,与代码快照显示的不同]

是的,它有可能[它被称为隐藏] - 但你不会得到动态调度行为.

静态类型将定义将调用哪个方法,而不是动态类型.

例如:

Parent* p = new Child;
p->func1();
Run Code Online (Sandbox Code Playgroud)

将调用Parent::func1()
时:

Child* c = new Child;
c->func1();
Run Code Online (Sandbox Code Playgroud)

会调用 Child::func1()


Jer*_*fin 6

不,实际上不可能覆盖父级中的定义(至少在谈论C++时,"覆盖"通常专门用于引用虚函数).相反,在子类中定义具有相同名称的函数只是隐藏具有相同名称的父级中的函数(即,在子对象的上下文中,查找该名称只会在子级中找到该函数,而不是父母中的那个).

如果你想(并且函数具有不同的签名),你也可以获得父和子被视为重载的函数,因此调用将尝试更好地调用任何匹配:

struct parent {
    void func1(char) {}
};

struct child : public parent { 
    void func1(long) { }

    using parent::func1;
};
Run Code Online (Sandbox Code Playgroud)

现在,你得到:

child c;
c.func1('a'); // calls parent::func1
c.func1(123L); // calls child::func1
Run Code Online (Sandbox Code Playgroud)

然而,这仍然是第三种类型的行为,不同于具有虚拟功能在孩子中具有隐藏父母中的功能的功能.

使用虚函数,调用哪个函数的选择基于动态类型,因此如果您有对基类的指针/引用,则调用的函数取决于是否引用基类或派生类的对象.

隐藏函数时,调用的函数基于静态类型,因此如果通过指向基类的指针/引用调用它,它将调用基函数,即使实际引用派生类的对象也是如此.但是,如果您使用指向或引用(或直接使用派生类的实例),它将调用派生类中的函数.

使用该using语句,您将获得函数重载,因此当您调用函数时(在派生类的上下文中),调用的函数基于哪个函数的签名与您传递的参数最匹配.