【问题标题】:Print Methods with polymorphism. c++具有多态性的打印方法。 C++
【发布时间】:2016-04-28 11:14:30
【问题描述】:

我有 2 个如下所示的类:

class A
{
public:
A();
~A();

virtual void func() { cout << "this is A class" << endl; };
};

和:

class B:public A
{
public:
B();
~B();

virtual void func() { cout << "this is B class" << endl; };
virtual void funcky() { cout << "How to print this method?" << endl; };
};

这是我的主要内容:

include "B.h"

void main()
{
A* a;

a = new B;
}

现在我的问题是如何打印“funcky”方法? (没有在 main 中创建 B 对象。)
我认为它与动态投射有关,但我不确定。

【问题讨论】:

  • 你想从A的接口访问一个在A的接口中不存在的方法?
  • 使用dynamic_cast 确实可以做到这一点。但是——我在这里与 Karoly Horvath 的观点相同——这似乎不太可能是实现提问者真正试图做的事情的最佳方式。 Tomer Uzan,为什么您究竟想调用B::funcky,而不需要声明任何类型为BB*
  • void main? include?呃

标签: c++ methods polymorphism


【解决方案1】:

初步说明:由于A 类旨在派生,它确实应该有一个虚拟析构函数。如果没有,A* a = new B; delete a; 将不会调用 B 析构函数。

那么,即使在这样一个简单的例子中也没有多大意义,你想要的是动态转换。它有点 hacky,但在标准中存在,并且在您解耦接口和实现时是有意义的。当实现类中的方法接收到指向接口的指针时,它使用动态转换将其转换为真正的类并使用私有方法。

在您的示例中,您应该简单地使用:

B* b = dynamic_cast<B *>(a);
if (b != nullptr) {
    b->funcky();
}

但是当你发现自己在使用动态转换时,你应该总是想知道你是否没有越轨地使用多态......

【讨论】:

  • 可以使用static_cast 而不是dynamic_cast 如果一个人绝对确定指向的对象的动态类型是(或派生自)你的派生类型想把它投射到。
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多