我有一个模板化的类层次结构,结构如下: 抽象类 -> 基类 -> 派生类。
AbstractClass 作为一个接口(interface)。
我在下面包含了我的代码:
#include <cstdlib>
#include <iostream>
using namespace std;
//AbstractClass
template <class T, class K>
class AbstractClass
{
public:
virtual void someMethod() const =0;
};
//end AbstractClass
//BaseClass
template <class T>
class BaseClass:AbstractClass<T,int>
{
public:
BaseClass();
BaseClass(const BaseClass<T>&);
void someMethod() const;
};
template <class T>
BaseClass<T>::BaseClass()
{}
template <class T>
BaseClass<T>::BaseClass(const BaseClass<T>& baseClass)
{}
template <class T>
void BaseClass<T>::someMethod() const
{}
//end BaseClass
//DerivedClass
template <class T>
class DerivedClass:BaseClass<T>
{
public:
DerivedClass();
//DerivedClass(const DerivedClass<T>&);
};
template <class T>
DerivedClass<T>::DerivedClass()
{}
/*
template <class T>
DerivedClass<T>::DerivedClass(const DerivedClass<T>& derivedClassClass)
{ BaseClass<T>::BaseClass(derivedClassClass);}
*/
//end DerivedClass
int main(int argc, char *argv[])
{
BaseClass<double> baseClass;
DerivedClass<double> derivedClass;
baseClass.someMethod();
derivedClass=(DerivedClass<double>)baseClass;
system("PAUSE");
return EXIT_SUCCESS;
}
我需要将 BaseClass 实例转换为 DerivedClass 实例。 我尝试通过
`derivedClass=(DerivedClass<double>)baseClass;`
但我收到以下错误:
no matching function for call to `DerivedClass<double>::DerivedClass(BaseClass<double>&)'
candidates are: DerivedClass<double>::DerivedClass(const DerivedClass<double>&)
.
DerivedClass 的复制构造函数均出现错误
DerivedClass(const DerivedClass<T>&);
实现和未实现。在上面的代码中,我对其进行了注释,以便您更轻松地进行有无测试。
我做错了什么?有人可以看看吗?
我正在使用 dev-cpp 4.9.9.2 和 c++'98。
最佳答案
让我们简单地说明为什么将基类转换为派生类对编译器来说是一个问题。
struct Base
{
int i;
};
struct Derived : public Base
{
float f;
};
Base b;
b.i = 10;
Derived d = (Derived)b;
当您这样做时,编译器无法确定如何初始化 d
中不在 b
中的部分。对于Derived
,它只是成员数据f
。对于其他更复杂的派生类,可能有更多的数据需要初始化。
但是,如果您有:
struct Derived : public Base
{
Derived(Base const& b) : Base(b), f(0f) {}
float f;
};
然后你就可以使用:
Base b;
b.i = 10;
Derived d = b;
编译器发现您已经提供了一种从Base
构造Derived
的方法,并且能够使用该构造函数构造d
.
关于C++'98 - 将基类转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23638079/