c++ - 在派生模板类中专门化方法形式基类

标签 c++ class inheritance polymorphism

我很难弄清楚我应该如何进行模板特化。不幸的是,这一次谷歌和 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

我应该如何对 derived 进行专门化,以便 getInt() 返回 mValue ?像这样的东西:

template<>
int derived<int>::getInt() { return mValue; } 

这是行不通的。

更清楚地说,当我调用 arg->getInt() 时,我希望 pe 输出 23 以及当我调用 arg->getInt() 时在基类中抛出的异常。 你能给我一个示例代码吗?谢谢。

最佳答案

derived 模板没有 getInt() 方法。您无法专门化不存在的东西。

您必须专门化整个模板。试试这个:

template<>
class derived<int> : public base
{
public:
    derived() {}
    derived(int value) { mValue = value; }
    int getInt() override { return mValue; } 
private:
    T mValue;
};

关于c++ - 在派生模板类中专门化方法形式基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664159/

相关文章:

c++ - 为什么 'class'和 'main'中的相等表达式表现不同?

JavaScript继承: How can we inherit object and function where object is created from function using new operator and has prototype functions

c++ - 通过 Matlab mex 函数调用持久化 C++ 类实例

c++ - 我在 DLL 项目 C++ 中收到 "nonstatic member reference must be relative to specific object"错误

c++ - 将原始指针提升到 valarray

python - 为什么描述符(在Python中)不能插入(放置)到已经初始化的对象中?

c++ - 在 C++ 中使用回调函数抓取帧。它如何与类(class)交流?

javascript - 将类方法中的值作为参数传递给同一类中的另一个方法 - JS

java - 组合与继承?

python多重继承,调用基类函数