如何访问子类的新成员函数?

时间:2018-09-10 14:31:50

标签: c++

我有2个课程:

#include <iostream>
using namespace std;

class A
{
public:
    virtual void print()=0;
};

class B: public A
{
public:
    void print()
    {
        cout<<"B\n";
    }

    void printNew()
    {
        cout<<"Print new";
    }
};

int main()
{
    B b;
    A *a=new B;
    a->printNew();
    delete a;
}

编译器发布错误。如果要通过A使用printNew,该怎么办?我认为它必须包含此功能,因为这在各种情况下都非常有用。

2 个答案:

答案 0 :(得分:6)

在超类A中具有子类实例B的指针在OOP中称为多态。 从该A型指针,您将无法清楚地看到仅存在于B型中的成员函数。 通过向下转换,您可以将此对象用作B型对象:

B *B = dynamic_cast<B*>(a);

由于a具有动态类型B *,因此强制转换是安全的,因此返回了B指针。

答案 1 :(得分:4)

多态不能那样工作。

尽管a具有 dynamic 类型B*,但其 static 类型为A*,因此指向成员运算符的指针->无法达到printNew功能。

您可能可以

virtual void printNew() { cout << "printNew() not implemented";}

A类中。

在C ++ 20中,即使调用语法不同,使用 reflection 确实可以实现所需的操作。