【发布时间】:2021-05-13 15:17:24
【问题描述】:
我想创建一个operator= 和复制构造函数,以便在继承的类中调用。
对于普通对象,它可以正常工作,但是当我尝试使用指针调用 operator= 时,它只是在复制对象地址。
所以我的问题是,如何使用指针调用这些方法?
#include <iostream>
// base class
class a {
public:
//constructors
a(): x(0), y(1), z(0){ std::cout << "no parameter constructor A\n"; }
a(int a, int b, int c) :x(a), y(b), z(c){ std::cout << "parameter constructor A\n"; }
a(const a& ob):x(ob.x), y(ob.y), z(ob.z)
{
std::cout << "copy constructor A\n";
}
//operator
a& operator=(const a& obj)
{
if (this != &obj)
{
x = obj.x;
y = obj.y;
z = obj.z;
}
std::cout << "operator = A\n";
return *this;
}
protected:
int x, y, z;
};
//child class
class b : public a
{
public:
//constructors
b() : p(0){ std::cout << "no parameter constructor B\n"; }
b(int X, int Y, int Z, int B) : a(X, Y, Z), p(B) { std::cout << "parameter constructor B\n"; }
b(const b& obj) :p(obj.p), a(obj)
{
std::cout << "copy constructor B\n";
}
//operator =
b& operator=(const b &obj)
{
if (this != &obj)
{
p = obj.p;
&a::operator=(obj);
}
std::cout << "operator = B\n";
return *this;
}
private:
int p;
};
int main()
{
b obj0(4, 8, 16, 32);
b obj1(obj0); // copy constructor
b obj2;
obj2 = obj1; // operator =
std::cout << std::endl << std::endl;
std::cout << "for pointers:\n\n";
a* obj3 = new b(4, 8, 16, 32);
a* obj4(obj3);
obj4 = obj3;
return 0;
}
【问题讨论】:
-
你需要一个接受指针的构造函数。
-
这里没有展示,但是如果你处理多态,请看:stackoverflow.com/questions/5148706/…
-
指针只是地址。你在 pointers 上调用
operator=,而不是在指向的对象上。确实是在复制指针。复制指针不会复制指向的对象。甚至标准的智能指针也没有做到这一点。我想自定义的 polymorphic_pointer 可以。 -
我试图让coliru.stacked-crooked.com/a/b545240219c77c8d 来处理这样的多态情况,但我在某处出现错误:(
标签: c++ pointers inheritance