首先:我已阅读并且我现在知道在C++中虚拟模板成员函数(但是?)是不可能的.解决方法是将类作为模板,然后在member-function中使用template-argument.
但是在OOP的上下文中,我发现如果该类实际上是一个模板,下面的例子将不会非常"自然".请注意,代码实际上不起作用,但gcc-4.3.4报告:error: templates may not be ‘virtual’
#include <iostream>
#include <vector>
class Animal {
public:
template< class AMOUNT >
virtual void eat( AMOUNT amount ) const {
std::cout << "I eat like a generic Animal." << std::endl;
}
virtual ~Animal() {
}
};
class Wolf : public Animal {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const {
std::cout << "I eat like a wolf!" << std::endl;
}
virtual ~Wolf() {
}
};
class Fish : public …Run Code Online (Sandbox Code Playgroud) 假设我创建了一个枚举,但最终有人想要添加到枚举,那么一个人做什么?例如:
// blah.hpp
enum PizzaDressing {
DRESSING_OLIVES = 0,
DRESSING_CHEESE = 1
};
Run Code Online (Sandbox Code Playgroud)
在我的FunkyPizza课上,可能会有辣椒浇头.
那么如何在不明显修改原始枚举的情况下添加辣椒呢?
谢谢
我有一个类层次结构,其中的每个类都有一个异常类,派生在并行层次结构中,因此......
class Base
{
};
class Derived : public Base
{
};
class BaseException : public std::exception
{
enum {THIS_REASON, THAT_REASON};
};
class DerivedException : public BaseException
{
// er...what?
};
Run Code Online (Sandbox Code Playgroud)
我想在DerivedException类中扩展枚举类型以包含新值THE_OTHER_REASON,以便DerivedException类可以包含三个值中的任何一个.
首先,我应该这样做吗?这似乎是一种合理的做法吗?如果是这样,我该怎么做呢?如果没有,你会推荐哪些替代品?
编辑:这里建议可能重复,但建议的解决方案是不同的,因为这个问题是C#和C++的问题.
我经常遇到这样的情况:我们创建了一个作用于某些枚举的类,但后来我们派生并希望在不更改基类的情况下向枚举添加更多值。
我从 2009 年看到这个问题: Base enum class继承
但是,我知道 C++11、14、17 中对枚举进行了许多更改。这些更改中的任何一个是否允许将枚举从基类扩展到派生类?
class Base
{
enum State {STATE_1, STATE_2, STATE_3};
};
class Derived : public Base
{
enum State {STATE_4};
};
Run Code Online (Sandbox Code Playgroud)
...我们希望派生有一个枚举来描述它可以处于的状态,即:STATE_1、STATE_2、STATE_3 和 STATE_4。我们真的不想更改基类中的枚举,因为其他派生类可能无法处于 STATE_4 中。我们也不想创建一个新的枚举,因为我们已经在 Base 中为 State 建立了一个枚举。
为了在 8 年后实现这一目标,我们是否仍然使用静态常量值?
class Base
{
static int STATE_1= 0;
static int STATE_2= 1;
static int STATE_3= 2;
};
class Derived : public Base
{
static int STATE_4= 3;
};
Run Code Online (Sandbox Code Playgroud) 是否有可能从枚举中得出,如果是这样的话?
例如:
enum eStandardTypes
{
Type1 = 0,
Type2,
Unknown,
Count,
};
enum eExtendedTypes : eStandardTypes
{
Type3 = eStandardTypes::Count,
Unknown,
Count,
};
Run Code Online (Sandbox Code Playgroud)