c++多态性,不完全向下转换
C++ Polymorphism, incomplete downcasting
我有一个数组,其中包含对平淡基类型的引用,我们称其为Object
。
我从Object
推导出Class1
,从Class1
推导出Class2
。
#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
关键字是否具有预期的效果?
应该调用Class2
的虚函数,因为对象是该类型的。
请记住:虚函数的目的是调用实际的类的函数,而不是指针/引用当前看起来是类的函数。
当我第一次回答你的问题时,我有点误解了你的问题,关于恶魔和你的鼻孔。
virtual
关键字将达到预期的效果。也就是说,你会看到2。虽然您已经转换为Class1
,但虚函数表将发挥它的魔力。
首先,这不是一个安全的强制转换。但是假设myvec[i]
是一个指针,您要转换到的对象,那么它将为该类调用适当的方法。
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- C++通常的算术转换不转换
- 字符类型转换不兼容
- 自制的上衣:看起来一样,但不完全相同
- 我不完全确定此代码的行为.有人可以向我解释一下吗?
- 用户定义的转换不能在C++中使用static_cast
- 为什么用户定义的转换不会在调用对象上隐式发生
- 为什么转换不起作用
- 为什么在相同大小的功能参数中隐式转换不会发出警告
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- pybind11:Python 到 C++ 数据类型转换不起作用
- 系统包括在分布之间不完全一致
- 前向声明和强制转换不完整类型 C++
- sqlite3_exec()!= SQLITE3_OK. 尝试在 OOP 中转换不起作用
- 我不完全确定这个大O的复杂性
- 两个不完全相同的函数指针是否兼容
- 气泡排序不完全有效
- 如何检测 W2A 转换是否完全成功
- C 构造函数隐式转换不会发生
- c++多态性,不完全向下转换