1

我想实例化一个模板化的抽象类,如下所示:

template <class T>
class non_sense {
public:
    void virtual nonsesnse_func() = 0;
};

为了制作这个类的整数实例,我尝试了以下方法:

void non_sense<int>::nonsesnse_func(){
}

然后我在 main 中创建我的实例:

non_sense<int> xx;

所以整个程序如下:

template <class T>
class non_sense {
public:
    void virtual nonsesnse_func() = 0;
};

void non_sense<int>::nonsesnse_func(){
}

void main(){
    non_sense<int> xx;
}

这对我来说完全有意义,但编译器不接受它,说这个类是抽象的。我不想采取使用特定模板创建从此类继承的新类的路线,因为我试图制作的大型应用程序将是大量写作。有人可以向我解释为什么编译器会拒绝这个,除了为我想要的特定实例创建一个新类之外,还有什么方法可以解决这个问题。

4

3 回答 3

3

non_sense 是一个抽象类,所以它永远不能被实例化为一个对象。

但是,这会编译并运行:

#include <iostream>

template <class T>
class non_sense {
public:
    virtual void nonsesnse_func();
};

// Specialize the method
template<>
void non_sense<int>::nonsesnse_func(){
    std::cout << "no_sense<int>::nonsense_func" << std::endl;
}


int main(){
    non_sense<int> xx;

    xx.nonsesnse_func();

    return 0;
}

这里的代码显示了如何使用纯抽象类运行它(我已将 nosnsnsense 重命名为废话,输入起来更容易;):

#include <iostream>

template <class T>
class non_sense {
public:
    virtual void nonsense_func() = 0;
};

template<class T> 
class non_sense_concrete : public non_sense<T> {

    public: 
        void nonsense_func() {
            std::cout << "non_sense_concrete<T> generic code" << std::endl;
        }

};

// Specialize the concrete class
template<>
void non_sense_concrete<int>::nonsense_func(){
    std::cout << "no_sense<int>::nonsense_func" << std::endl;
}


int main(){

    non_sense_concrete<double> objectGeneric;
    objectGeneric.nonsense_func(); 

    non_sense_concrete<int> objectInt;
    objectInt.nonsense_func();


    return 0;
}
于 2013-01-08T11:27:44.477 回答
1

看起来很奇怪,纯虚方法可以在 C++ 中实现。这并没有改变方法是纯虚拟的并且包含它的类是抽象的事实。

如果您希望该类non_sense对除 之外的所有类型都是抽象的int,则必须为整个类提供专门化,而不仅仅是为纯虚拟成员:

template <class T>
class non_sense {
public:
    virtual void nonsense_func() = 0;
};

template <>
class non_sense<int> {
public:
    virtual void nonsense_func()
    {
        std::cout << "no_sense<int>::nonsense_func" << std::endl;
    }
};

对于较大的类,继承可能会更容易,因为派生类可以从 继承其他成员non_sense,而不必复制整个类(正如您在创建专业化时需要做的那样)。

于 2013-01-08T11:45:45.510 回答
0

如果您有一个具有纯虚函数(即抽象)的类,您必须创建第二个实现该虚函数的类。否则,您将永远无法使用该类。

在您的代码中,您实现了一个函数,但它不是虚拟的,因为它不在类内部。它需要被声明和定义为 non_sense 的子类的一部分才能工作。请记住,只有类才能具有虚函数。

于 2013-01-08T11:42:11.210 回答