有一个C++变量可以是ClassFoo或ClassBar
我有兴趣编写一个打印机来输出两种不同的格式。我们称它们为 txt 和 csv。
可以在 C++ 中实现类似下面的内容吗?
class Printer {
public:
virtual void header() = 0;
};
class CSV : Printer {
public:
void header() { printf("csvn"); }
};
class TXT : Printer {
public:
void header() { printf("txtn"); }
};
int decider(int type) {
auto prt;
if (type == 1) {
prt = new CSV;
} else {
prt = new TXT;
}
prt.header();
}
如果没有,有什么替代方法可以做类似的事情?
回答
而不是auto你想要一个指向基类的指针
int decider(int type) {
Printer* prt;
if (type == 1) {
prt = new CSV;
} else {
prt = new TXT;
}
prt->header();
}
但是,而不是原始指针和new(因为您正在从丢失的内存中泄漏delete)我会在这里使用智能指针
#include <memory>
int decider(int type) {
std::unique_ptr<Printer> prt;
if (type == 1) {
prt = std::make_unique<CSV>();
} else {
prt = std::make_unique<TXT>();
}
prt->header();
}
正如@FredLarson 所指出的,您的基类中还需要一个虚拟析构函数
class Printer {
public:
virtual ~Printer() = default;
virtual void header() = 0;
};
您还应该从基类公开继承
class CSV : public Printer {
...
};
class TXT : public Printer {
...
};
- I believe `Printer` will need a virtual destructor to avoid UB here.
- You can't say `prt.header` in this code. Either change `prt` to `prt_p` and after the if statement make a `Printer& prt`, or change the last line to `prt->header`.