C++ 构造函数和复制构造函数访问相同的派生类

C++ 构造函数和复制构造函数访问相同的派生类,c++,constructor,copy-constructor,derived-class,base-class,C++,Constructor,Copy Constructor,Derived Class,Base Class,是否可以使用复制构造函数从派生类“twin”初始化相同的派生类 我的意思是我想初始化一个类型为Computer的对象,它与我已经初始化的类型为User的对象相同。 计算机载波=用户载波之类的东西 例如 main.cpp #include "game.h" using namespace std; int main() { User carrier(5, "Airship Carrier"); //Computer carrier = User::carrier; };

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

我的意思是我想初始化一个类型为
Computer
的对象,它与我已经初始化的类型为
User
的对象相同。
计算机载波=用户载波之类的东西

例如

main.cpp

#include "game.h"

using namespace std;

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

它们是相同的派生类,我只是将它们作为一种虚拟和可视化的方式来表示编程代码中的
用户
和AI战舰,用于测试船舷之间的碰撞和射击。

用户
计算机
是完全不同的类型。您可以为其添加模板副本构造函数

在基类中添加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计算机:公共游戏
{
公众:
样板
计算机(const T&T){
m_iSize=t.get_iSize();
m_strName=t.get_strName();
}
// ...
};

并考虑将构造函数显式化以避免意外的隐式铸造。< /P> < P>或者,您需要2种不同类型,然后不能这样做(不能从狗创建一只猫),或者希望它们共享同一类型,但要通过不同的类型名称来操作,那么您应该只使用TyBuff:

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

using User = Game;
using Computer = Game;
然而,从设计的角度来看,这种方式似乎不正确,因为计算机不是用户(IMHO)

另一方面,您可以在用户和计算机中创建一个从游戏构建的构造函数;比如:

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

但事实仍然是,从计算机构建用户似乎“很奇怪”。您的
用户
计算机
类型之间的唯一关系是它们都源自
游戏


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

当您在代码中说“无构造函数”时,你知道有隐式声明的构造函数吗?你可以用任何类型的对象编写构造函数<代码>计算机::计算机(用户const&other){/*…*/}
——您如何使复制构造函数这样做,这取决于您自己。为了访问任何
用户
的私人成员,您需要使用可怕的
朋友
…我认为您需要在计算机中定义一个以用户为参数的构造函数。如果它们“相同”,为什么是两个独立的类呢?
Game
的一些实现缺少并将导致未定义的行为。我知道这不是问题的核心,但仍然值得指出。注意安全,在所有非
final
(这是一个非常有用的新C++11关键字)类中使用它。他正在实现一个战舰游戏。他为
用户
飞船和
计算机
飞船各上了一门课。我同意,一般来说,设计很糟糕,但这就是为什么他考虑从
用户
一台创建/分配
计算机
飞船的原因。
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) { /*...*/ }
  /*...*/
};