【问题标题】:C++ Polymorphism, incomplete downcastingC ++多态性,不完全向下转换
【发布时间】:2011-12-10 23:11:03
【问题描述】:

我有一个数组,其中包含对平淡基本类型的引用,我们称之为Object

我从ObjectClass2Class1 派生了Class1

#include <vector>

class Object {};
class Class1 : public Object {
public:
virtual std::string ToString() {return "it is 1";}
};
class Class2 : public Class1 {
public:
    virtual std::string ToString() {return "it is 2";}
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Object *> myvec;
    myvec.push_back(new Class2());
    printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());
    return 0;
}

我通过从Object * 转换为Class1 * 来调用ToString(),就像这样

    printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());

我的问题是,当对象实际上是 Class2 但没有具体向下转换时,这个输出会是 1 还是 2? virtual 关键字是否具有预期效果?

【问题讨论】:

  • 我和法尔马里在一起;与提出问题并得到答案相比,尝试它所花费的时间更少。
  • 不,这意味着加载我的手机模拟器,我它可能对其他人有用。给尼科尔一个直接的答案会花更少的时间吗?
  • @John:手机模拟器? C++是C++;这就是重点。您不必在手机上运行它来测试语言的基本功能。只需要一个 15 行的程序来测试它。

标签: c++ polymorphism virtual-functions static-cast


【解决方案1】:

它应该调用Class2 的虚函数,因为对象就是那个类型的。

记住:虚函数的目的是调用实际类的函数,而不是指针/引用当前看起来是的类的函数。

【讨论】:

    【解决方案2】:

    当我第一次回答你关于恶魔和你的鼻孔的问题时,我有点误读了。

    virtual 关键字将达到预期效果。也就是说,您将看到 2。虽然您已转换为 Class1,但 vtable 将发挥它的魔力。

    【讨论】:

    • 啊,是的,我的第一次尝试是多么糟糕的例子。
    【解决方案3】:

    首先,这不是一个安全的演员阵容。但假设myvec[i] 是一个指向您要转换的对象的指针,那么它将调用该类的适当方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多