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会更好,因为派生类必须识别基类的成员。但它仍然不能回答我的问题。不幸的是,你完全没有理解我的观点,那就是让编译器进行复制。你的例子一团糟——这对你的观点毫无帮助。幸运的是,有人能够理解我的一团糟并回答我的问题。