构造函数和复制构造函数具有相同的派生类

时间:2015-11-02 09:21:44

标签: c++ constructor copy-constructor derived-class base-class

是否可以使用复制构造函数从派生类“twin”初始化相同的派生类?

我的意思是我要初始化类型为Computer的对象,该对象与我已初始化类型为User的对象相同。 Computer cCarrier = User uCarrier;有点儿。

E.g

class Game
{
public:
    //No constructor Intentional
protected:
    int m_iSize;
    string m_strName;

};

class User: public Game
{
public: 
    User(int _iSize, string str_Name);
    ~User();

};

class Computer: public Game
public: 
    Computer(int _iSize, string str_Name);
    ~Computer();
};

的main.cpp

#include "game.h"

using namespace std;

int main()
{
     User carrier(5, "Airship Carrier");
     //Computer carrier = User::carrier;
};

它们是相同的派生类,我只是通过这种方式将它们作为一种虚拟和直观的方式来表示编程代码中的User和AI战舰,程序员以及测试侧面船只的碰撞相互对抗并射击。

3 个答案:

答案 0 :(得分:0)

UserComputer完全不同。您可以为它添加模板复制构造函数。

在基类中添加getter:

class Game
{
public:
    //No constructor Intentional
    int get_iSize() { return m_iSize; }
    string get_strName() { return m_strName; }
protected:
    int m_iSize;
    string m_strName;

};

然后

class Computer: public Game
{
public: 
    template <typename T>
    Computer(const T& t) {
        m_iSize = t.get_iSize();
        m_strName = t.get_strName();
    }
    // ...
};

并考虑使构造函数显式化以避免意外的隐式转换。

答案 1 :(得分:0)

你想要2种不同的类型然后你不能这样做(不能用狗创建一只猫),或者你希望它们共享相同的类型但是要通过不同的类型名进行操作然后你应该只使用一个typedef:

class Game
{
public:
   Game(int _iSize, string str_Name);
private:
    int m_iSize;
    string m_strName;
};

using User = Game;
using Computer = Game;

然而,从设计角度来看,这种做法似乎不正确,因为计算机不是用户(恕我直言)。

另一方面,您可以在用户和计算机中创建一个构建函数,该构造函数是从游戏构建的;类似的东西:

class Computer {
  Computer(const Game &game) : Game(game) { /*...*/ }
  /*...*/
};

但仍然是从计算机构建用户似乎“奇怪”的事实。

答案 2 :(得分:0)

UserComputer类型之间的唯一关系是它们都来自Game

因此,没有办法通过以你想要的方式委托给另一个来构建一个构造函数(缺少包含,创建不同的对象,不使用一种类型的构造函数来初始化一个实例无关的类型)。