c++ - 没有类型转换的模板派生类的 C++ 访问成员
问题描述
是否可以使用指向基类的指针访问派生类的成员?
// Example program
#include <iostream>
#include <vector>
#include <memory>
#include <string>
class A {
public:
std::string x = "this is the wrong x\n";
};
template <class T>
class B : public A {
public:
T x;
};
int main()
{
std::vector<std::unique_ptr<A>> vector;
auto i = std::make_unique<B<int>>();
i->x = 6;
vector.push_back(std::move(i));
for(auto &element : vector){
std::cout << element->x;
}
}
在这里,我总是从类 A 中获取输出。我无法对其进行类型转换,因为我事先不知道元素是 A 类型还是 B 类型。有没有合适的方法来做到这一点?
解决方案
正确的方法是创建一个virtual
函数来执行打印等任务。
class A {
public:
std::string x = "this is the wrong x\n";
virtual ~A() = default;
virtual void print() const { std::cout << x; }
};
template <class T>
class B : public A {
public:
T x;
virtual void print() const override { std::cout << x; }
};
int main()
{
std::vector<std::unique_ptr<A>> vector;
auto i = std::make_unique<B<int>>();
i->x = 6;
vector.push_back(std::move(i));
for(auto &element : vector){
element->print();
}
}
推荐阅读
- google-chrome-extension - 注入 Chrome 扩展内容脚本的最低权限
- python-3.x - Python Panda Dataframe 替换列中的值
- javascript - 不和谐.js | 如何制作在用户加入时发送用户信息的代码?
- cmake - 隐藏
和 Qt Creator 中的 CMake 模块 - javascript - 从原始 json 获取不存在的数据并将其附加到表中
- css - 在 SASS 中为 3 个嵌套块使用根类名
- datetime - TAI 时间可以用 ISO 8601 表示吗?如果可以,如何表示?
- maui - http 链接可以在 MAUI Windows 应用程序中打开特定窗口吗?
- excel - 如何根据同一行中另一个单元格的值更改 Excel 中单元格的颜色(在表格中),并为每个新行重复此操作?
- android - Jetpack Compose 中具有输入字段和验证的复杂动态网格