我有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,该怎么办?我认为它必须包含此功能,因为这在各种情况下都非常有用。
答案 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 确实可以实现所需的操作。