繁体   English   中英

有没有一种方法可以通过指向基数的指针来复制派生类对象?

Is there a way to copy a derived class object thru a pointer to base?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

有没有一种方法可以通过指向基数的指针来复制派生类对象? 还是如何创建这样的副本构造函数?

例如:

class Base { 
public: Base( int x ) : x( x ) {}
private: int x;
};

class Derived1 : public Base { 
public: 
Derived( int z, float f ) : Base( z ), f( f ) {}
private: 
float f;
};

class Derived2 : public Base {
public: 
Derived( int z, string f ) : Base( z ), f( f ) {}
private: 
string f;
};

void main()
{ 
Base * A = new *Base[2];
Base * B = new *Base[2];
A[0] = new Derived1(5,7);
A[1] = new Derived2(5,"Hello");
B[0] = Base(*A[0]);
B[1] = Base(*A[1]);
}

问题是* B [0]是否为Derived1对象,* B [1]是否为Derived2对象? 如果没有,我如何通过指向基类的指针复制派生类? 是否有通过基类或派生类构造复制构造函数的特定方法? 默认的复制构造函数是否足以胜任该示例?

2 个回复

您可以为此提供虚拟方法Clone

class Base { 
public:
    Base(int x) : x(x) {}
    virtual ~Base() {}
    virtual Base* Clone() const { return new Base(*this); }
private:
    int x;
};

class Derived1 : public Base { 
public: 
    Derived1(int z, float f) : Base(z), f(f) {}
    virtual Derived1* Clone() const { return new Derived1(*this); }
private: 
    float f;
};

class Derived2 : public Base {
public: 
    Derived2(int z, std::string f) : Base(z), f(f) {}
    virtual Derived2* Clone() const { return new Derived2(*this); }
private: 
    std::string f;
};

main行的第二行中(除了错别字),构造了Base类的两个实例,然后您要问,在最后两行中,这些对象是否会以某种方式立即发生变形并成为派生类的实例。 那当然是不可能的。

另外,请检查此答案

注意 :我只是在评论您提供的代码和用例。 使用虚拟Clone功能是复制多态对象的正确设计。

2 有没有一种方法可以有效地为多个派生类的指针制作模板函数?

我想通过传递指向这些类的指针来制作一个可以与所有不同派生类进行交互的函数,但是当我尝试这样做时,总是会出现许多类型的错误。 Bird,Bug,Fish和Lion都具有unique()和makeNoise()((虽然Animal.h中不存在唯一性,但makeNoise作为虚拟对象存在)。 ...

2019-11-16 22:56:55 0 35   c++
3 有没有一种方法可以使派生类中的方法不覆盖基类方法

我目前正在学习来自c ++背景的Objective-C。 我想知道是否有一种方法可以使派生类方法具有与基类相同的签名,而不覆盖它。 我读到Objective-C中的每个方法都是虚方法,是否有任何方法可以模拟派生类而不覆盖基类方法? 我有以下两节课 当我像这样使用它时 我 ...

5 在C ++中有没有一种方法可以让派生类重写基类的静态方法?

我有一个多次衍生的基类B:D1,D2等。 在类B中,我希望有一个静态方法getInfo()返回BaseInfo类(基本上是一个类,其中包含类B的默认成员值),因此将其设为静态是有意义的,因为不需要特定的实例。 现在,是否有一种方法可以强制派生类实现此方法? 显然,每个派生类都有其自 ...

6 有没有办法防止在派生类的实例上调用基类方法?

我有一个具有一堆功能的基类和一个扩展该类的派生类,但基类中有一些方法对派生类没有意义。 是否可以采取措施防止派生类使用这些方法? 以下显然不起作用,但是否可以做类似的事情,以便编译器不允许调用某个基类方法? ...

8 有没有一种方法可以使所有派生类彼此成为朋友?

如果是这样,在什么情况下这可能有用? 或者(我想是这样),为什么它绝对没用? (还有什么其他方法本质上涵盖了这种友谊所提供的能力,但是以一种更安全,更少泄漏的方式?) 我当时几乎以为我需要这样的东西。 最后,我进行了完全不同的设计,使所有类成员变为静态。 我还是很好奇。 ...

9 有没有办法让派生类不继承基类的所有成员?

所以我将 elipse 作为基类,它的成员有两个代表两个半径的双精度值。 我想从中派生一个圆类。 Circle 只需要一个半径作为成员,但它仍然从 elipse 继承两个。 我觉得我在浪费内存。 在这种特殊情况下,这没什么大不了的,但我认为在其他情况下可能会如此。 ps elipse 也派生自一 ...

10 有没有一种方法可以使用派生类访问基类中的值?

我正在使用c ++,我不知道如何使用派生类访问基类中的变量。 我需要获取基类中的值并在派生类中进行操作,因为基类中的所有函数都包含参数,因此当我调用该函数时, 例如: 我不能放任何参数,因为它没有定义。 我已经做过构造器部分,例如 但我仍然无法访问这些值。 救命? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM