Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不知道类成员的情况下,从基类实例创建派生类实例_C++_Visual C++_Inheritance_Templates - Fatal编程技术网

C++ 在不知道类成员的情况下,从基类实例创建派生类实例

C++ 在不知道类成员的情况下,从基类实例创建派生类实例,c++,visual-c++,inheritance,templates,C++,Visual C++,Inheritance,Templates,这种情况可能吗 class Base { int someBaseMemer; }; template<class T> class Derived : public T { int someNonBaseMemer; Derived(T* baseInstance); }; 类基 { int-someBaseMemer; }; 模板 派生类:public T { int-someNonBaseMemer; 派生(T*baseInstance); }; 目标: B

这种情况可能吗

class Base
{
  int someBaseMemer;
};

template<class T>
class Derived : public T
{
  int someNonBaseMemer;

  Derived(T* baseInstance);
};
类基
{
int-someBaseMemer;
};
模板
派生类:public T
{
int-someNonBaseMemer;
派生(T*baseInstance);
};
目标:

Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);
Base*pBase=newbase();
pBase->someBaseMemer=123;//某些值集
衍生*衍生=新衍生(pBase);

pDerived->someBaseMemer的值应该等于pBase->someBaseMember,并且与其他基成员类似。

为什么要同时派生和传递基指针?选择其中一个,没有什么能阻止你同时拥有这两个。使用继承为您完成以下工作:

class Base
{
  public:
    Base(int x) : someBaseMemer(x) {}
  protected:      // at least, otherwise, derived can't access this member
    int someBaseMemer;
};

template<class T>
class Derived : public T
{
  int someNonBaseMemer;

  public:
  Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
};

Derived<Base> d(42, 32); // usage
类基
{
公众:
Base(intx):someBaseMemer(x){}
至少受保护://否则,派生成员无法访问此成员
int-someBaseMemer;
};
模板
派生类:public T
{
int-someNonBaseMemer;
公众:
派生的(intx,inty):一些非基元(y),T(x){
};
导出d(42,32);//使用

虽然不是设计的最佳选择。

someBaseMemr
声明为公共,或将声明从
class
更改为
struct

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};
请记住,默认情况下,
具有对所有成员和方法的
私有
访问权限。默认情况下,
struct
提供
public
访问


另外,所有派生类都应该具有从
Base

继承的
public
,为什么不完成代码的编写和编译呢

class Base 
{ 
public: // add this
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
public: // add this
    int someNonBaseMemer; 

    Derived(T* baseInstance)
        : T(*baseInstance) // add this
    { return; } // add this
}; 
类基
{ 
public://添加此项
int-someBaseMemer;
}; 
模板
派生类:public T
{ 
public://添加此项
int-someNonBaseMemer;
派生(T*baseInstance)
:T(*baseInstance)//添加此
{return;}//添加此
}; 
这将按照您指定的方式编译和运行


编辑:或者你的意思是
someNonBaseMemer
应该等于
someBaseMemer

你为什么想要这样一个扭曲的东西?StackOverflowException?哈哈……严肃地说……这不会被编译。@Elite:事实上,如果你将成员更改为公共成员,它会被编译。但这并没有让它变得不那么可怕。在我看来,你可以用它来创建一个对象的合并,这些对象拥有你个人想要的功能,同时保留它们自己的功能。想象一下,有一个集合,不管发生什么,它都能够调用read()和write(),并且写入或读取的内容也取决于设备类型(串行端口?文件?内存文件描述符?)。这看起来是一个糟糕的设计。这看起来是一个简单的CRTP加上从基类实例复制的应用程序,并且将基础对象(从复制到)传递到派生的Cor作为引用,而不是指针在C++中更常见。海报的技术是一种模式,允许on更改基类或派生类的派生路径。我也使用过这种技术。派生(T*baseInstance):T(*baseInstance)是解决方案。我尝试了T(baseInstance),但遇到了编译器错误。涉及模板的编译器错误消息,例如SomeClass::NestedClass::blablah,让我毛骨悚然。谢谢。这里还有一个很好的答案,但已被删除。我不知道为什么。派生(const T&baseInstance):T(baseInstance)也是一个很好的提示,但不适用于我的特定情况。我问题中的例子只是一些更大的问题中的一小部分。令人惊讶的是,人们多么渴望投票支持那些没有抓住要点的答案。当基类有更多成员时,派生(int,int)构造函数有什么意义?在您的示例中,类派生:public Base会更好,因为派生类必须识别基类的成员。但它仍然不能回答我的问题。不幸的是,你完全没有理解我的观点,那就是让编译器进行复制。你的例子一团糟——这对你的观点毫无帮助。幸运的是,有人能够理解我的一团糟并回答我的问题。