【问题标题】:virtual function with parameter as class pointer以参数为类指针的虚函数
【发布时间】:2016-03-26 09:56:18
【问题描述】:
class A
{
      public:
             virtual void display_A(A* obja)
             {
                     cout<<"Class A"<<endl;
             }
};
class B:public A
{
      public:
             void display_A(B* objb)
             {
                     cout<<"Class B"<<endl;
             }
};

int main()
{
    A AOBJ;
    B BOBJ;
    A *obja = new B();
    obja->display_A(&AOBJ);
    obja->display_A(&BOBJ);
    return 0;
}

类 A 中有一个虚函数,其参数为 A*,我们正在使用参数 B* 覆盖派生 class B 中的相同函数。

我创建了一个指针obja(指向类A),它指向派生类对象B。当我使用 obja 指针和参数作为类 A 对象指针和类 B 对象指针调用函数 display_A 时,我得到 o/p 为

Class A
Class A

我无法理解为什么我会得到那个 o/p。

【问题讨论】:

  • 无论如何您都可以重新考虑设计。您使用一种对象显示方法来显示另一个对象。如果对象使用自己的显示方法来显示会不会更好(这种情况下不需要显式传递指针作为参数)?

标签: c++ overriding virtual-functions


【解决方案1】:

不是overriding,因为参数的类型不一样。

如果某个成员函数 vf 在类 Base 中被声明为 virtual,并且 一些派生类,直接或间接派生自 Base, 有一个相同的成员函数声明

name
parameter type list (but not the return type)
cv-qualifiers
ref-qualifiers 

那么 Derived 类中的这个函数也是虚的(无论是 不是在其声明中使用关键字 virtual)并覆盖 Base::vf(无论是否在其 声明)。

使用override specifier 可以帮助您在编译时找到错误。

指定一个虚函数覆盖另一个虚函数。

在成员函数声明或定义中,override 确保函数是虚拟的,并且覆盖基类中的虚拟函数。如果这不是真的,则程序格式错误(生成编译时错误)。

class B:public A
{
      public:
             void display_A(B* objb) override
             //                      ^^^^^^^^
             {
                     cout<<"Class B"<<endl;
             }
};

【讨论】:

  • 你能解释一下覆盖吗?
  • @VaradMahashabde 你的意思是override specifier?链接页面非常适合参考。
【解决方案2】:

当通过 A* 调​​用 display_A 时,要么调用 A 或 B 的虚拟函数,要么调用 A 的非虚拟函数。由于原型不同,唯一符合此条件的函数是 A::display_A。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多