【发布时间】:2016-04-16 12:26:21
【问题描述】:
我很难弄清楚我应该如何进行模板专业化。这一次,不幸的是,google 和 SO 帮不了我。
对于基类:
class base
{
public:
virtual ~base() = 0;
virtual int getInt() { throw std::invalid_argument(std::string(typeid(*this).name()) + " can't return int"); }
};
base::~base() {}
和派生类:
template<class T>
class derived : public base
{
public:
derived() {}
derived(T value) { mValue = value; }
private:
T mValue;
};
这段代码:
void proof(base* arg)
{
try
{
std::cout << arg->getInt();
}
catch (std::exception& e)
{
std::cout << e.what();
}
std::cout << "\n\n";
}
int main()
{
base* a = new derived<int>(23);
base* b = new derived<std::string>("abc");
proof(a);
proof(b);
delete a;
delete b;
return 0;
}
输出,如果不是很明显:
class derived<int> can't return int
class derived<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > can't return int
我应该如何对派生进行专门化,以便 getInt() 返回 mValue ?比如:
template<>
int derived<int>::getInt() { return mValue; }
这不起作用。
为了更清楚,我希望在调用 arg->getInt() 时输出 23,并且在调用 arg->getInt() 时在基类中抛出异常。 你能给我一个示例代码吗?谢谢。
【问题讨论】:
-
默认构造函数看起来是个糟糕的主意!它是什么意思?
-
我正在尝试封装一些数据类型,以便可以制作多种数据类型的向量。注意: int 只是一个例子,我确实有另一个不封装基本类型的类。
标签: c++ class inheritance polymorphism