作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 10 种硬币类型:BTC、ETH、Shift 等。为此,我有一个父类(super class)“Coin”和每个这些硬币的子类。然后我有一个指向“硬币”类型的指针,这样我就可以调用每个子类,无论它们是什么子类型。
问题是,我只知道如何用 Java 而不是 C++。我很难搜索正确的术语,因为除了“泛型”之外,我真的不知道要搜索什么。我想要的是这样的:
// Superclass
class Coin {
public:
virtual void handleCoin();
};
// Subclass
class BTC: public Coin {
void handleCoin();
}
BTC::BTC() = default;
BTC::~BTC() = default;
BTC::handleCoin() {
std::cout << "handling BTC" << std::endl;
}
// Subclass
class ETH: public Coin {
void handleCoin();
}
ETH::ETH() = default;
ETH::~ETH() = default;
ETH::handleCoin() {
std::cout << "handling ETH" << std::endl;
}
// Execute
int main() {
Coin* coin;
coin = BTC();
coin.handleCoin();
coin = ETH();
coin.handleCoin();
return 0;
}
我要打印:
handling BTC
handling ETH
我知道我需要使用模板,但我找不到这个具体案例的具体示例。
另外,我的构造函数不带参数,所以我猜我的模板声明应该是这样的
template<>
然而我看到的所有例子都适用
template<typename T>
然后像调用一样使用类型 T 作为函数参数
max<float, float>
max<double, double>
但这不是我要找的。有没有办法将上面的示例转换为有效的 C++ 代码?
最佳答案
从发布的代码中我看不出需要模板,虚拟方法无需模板即可工作。要修复 main 中的代码,您需要使用指针/引用并且还需要一个虚拟析构函数。
class Coin {
public:
virtual void handleCoin();
virtual ~Coin()=default;
};
class BTC: public Coin {
public:
BTC::BTC() = default;
//Destructor of a derived class is automatically virtual if the base class's one is.
void handleCoin();
}
// Subclass
class ETH: public Coin {
void handleCoin();
ETH::ETH() = default;
//Still virtual even if you specify otherwise
ETH::~ETH() = default;
}
int main() {
Coin* coin;
coin = new BTC();//Returns BTC* <--pointer
coin->handleCoin();
delete coin;//Calls Coin::~Coin() -> thus the need for virtual so BTC::~BTC is called instead.
coin = new ETH();
coin->handleCoin();
delete coin;//Same, calls ETH::~ETH()
return 0;
}
手动内存管理容易出错,从 C++11 开始有一个更好的方法应该被强烈推荐:
int main() {
std::unique_ptr<Coin> coin;//Hides the pointer, but still has pointer-like semantics
coin = std::make_unique<BTC>();
coin->handleCoin();
//Automatically frees old memory
coin = std::make_unique<BTC>();
coin->handleCoin();
//Calls unique ptr's dtor because coin is local variable, which again frees the memory correctly.
return 0;
}
关于c++ - 如何构造一个可以代入子类然后泛化调用的模板类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956647/
我是一名优秀的程序员,十分优秀!