C++'98 - 将基类转换为派生类

标签 c++ inheritance casting copy-constructor

我有一个模板化的类层次结构,结构如下: 抽象类 -> 基类 -> 派生类。

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/

相关文章:

C++ 与 Python 在特定问题上的对比

Java:如何从 <?扩展 ...> 到 <E>

Java 直接强制转换与使用局部变量强制转换

c++ - 使用 auto 关键字填充双索引 vector

c++ - 自 C++17 以来,具有正确地址和类型的指针是否仍然始终是有效指针?

python - 如何基于父类(super class)更改子类的属性

c++ - 从类模板派生时使用派生类

sql - 转换与转换 SQL Server

c++ - 是否值得将 540 字节的类切成更小的 block ? (C++)

c# - 修改父行为的访问者的层次结构。 Liskov 还好吗?