2015-10-06 47 views
-2

我有一个继承到派生类中的基类。然后我实例化基础对象和派生对象。访问派生对象中的继承类

class Base 
    { public : 
      Base() {} 
     ~Base) {} }; 

class Derived : public Base 
    { public : 
      Derived() {} 
     ~Derived() {} }; 

Base b; 
Derived d; 
Derived::Base::d = b; 

现在我想将基类对象(b)复制到派生类对象(d)中,代替它的继承基类。关于语法的任何想法?

+0

任何接受与一个基地接受派生,如果基地是可复制的'基地b = d;'应该管用。 –

+0

你究竟在做什么? http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

+0

*“语法上的任何想法?”* - 这不是一个具体问题的问题。 Stackoverflow是关于具体解决方案的具体问题。 –

回答

1

我想你想说的是,你想初始化Derived的数据成员给一些Base的成员。

您可以使用Base中的拷贝构造函数和Derived中的相应构造函数来传递值。

Code

class Base 
{ 
    public : 
     Base() { /*...*/} 
     Base(const Base& other){/*...*/} 
     virtual ~Base() {/*...*/} 
    private: 
     /*...*/ 
}; 

class Derived : public Base 
{ 
    public : 
     Derived() {/*...*/} 
     ~Derived() {/*...*/} 
     Derived(const Base& other) : Base(other){/*...*/} 

}; 

int main() 
{ 
    Base b; 
    Derived d(b); 
} 

您可以转发构造函数和赋值操作符做类似的操作。

+0

做好基础类析构函数是很重要的! – user3282085

+0

@ user3282085:仅当这些类将以多态方式使用时。如果没有,那么添加虚拟析构函数是浪费。 –

0
Derived::Base::d = b; 

的语法任何想法?

这是错误的。对于工作语法选项将包括:

  • static_cast<Base&>(d) = b;
  • d.Base::operator=(b1);

两者都是很丑陋;这是由于子类中的赋值运算符隐藏了基本版本。就像在C++中经常出现的那样,语法的丑陋性表明这种操作是不寻常的,重构可能是一个好主意。


一般来说,运算符重载和继承不拌匀,特别是如果你正在使用面向对象的编程继承(即虚拟函数)。在这种情况下,通常会确保该类根本不可分配(因为您只需在基类中生成分配运算符delete,所以C++ 11变得非常简单)。

你也应该多看一些关于对象切片,例如所有的答案和注释,这两个问题: