基类的析构函数为保护的时候
1. 基类的析构函数为保护的时候
为什么要这样设计呢? 不明白有什么意义?
而且delete 基类指针 从语法角度看, 会去调用 基类的析构函数, 此时会protected,
可以调用吗?
2.
构造函数,析构函数, 拷贝构造, 这3种都可以继承给 派生类吗?
[解决办法]
class B
{
protected:
virtual ~B() {};
};
class D : public B
{
public:
virtual ~D() {};
};
B* get_Sing()
{
static D d;
return &d;
}
int main()
{
B* s = get_Sing();
//delete s; // 出错, 被保护的
}
1. 一般用来禁止生成基类对象,强制通过派生类使用基类功能,NVI pattern 就用了这招儿。
2. 标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。
自定义复制构造函数的话,需要自己调用。
这么说, 派生类的拷贝构造函数,我们也要提供 对基类的拷贝了, 因为基类的拷贝构造函数,已经无法使用了,
派生类不能使用,所谓的不能继承
不懂你说什么,为啥基类的复制构造函数无法使用,写点儿代码秀一下你的观点。
我是按照你的回帖得出的结论啊:
标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。
举个例子:
例子:
class A
{
...
public:
A(const A& onther)
{
}
};
class B: public A
{
public:
B( const B& another)
{
}
};
调用: B obj1;
B ojb2= obj1; //拷贝构造
如果A中有指针成员,A的拷贝构造代码里也做了深拷贝。
但是B的构造函数代码并没有对继承过来的指针成员做深拷贝, B的拷贝构造所做的工作仅仅是:
对B类新增加的数据成员做处理, A的成员它不管, B的拷贝构造只提供了处理B新增加的数据成员的代码,
那么此时 B obj2=obj1; 能否获得我们需要的正确结果呢?
我说 "自定义复制构造函数的话,需要自己调用。" 是这个意思。
class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
原来如此,多谢
那10楼中提到的:
么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
对不? 感觉不对啊, 这样太麻烦了啊, 呵呵。
class Base {
public:
virtual void release() = 0;
};
class Derived: public Base {
private:
virtual void release() { delete this; }
};
1. 一般用来禁止生成基类对象,强制通过派生类使用基类功能,NVI pattern 就用了这招儿。
2. 标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。
自定义复制构造函数的话,需要自己调用。
这么说, 派生类的拷贝构造函数,我们也要提供 对基类的拷贝了, 因为基类的拷贝构造函数,已经无法使用了,
派生类不能使用,所谓的不能继承
不懂你说什么,为啥基类的复制构造函数无法使用,写点儿代码秀一下你的观点。
我是按照你的回帖得出的结论啊:
标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。
举个例子:
例子:
class A
{
...
public:
A(const A& onther)
{
}
};
class B: public A
{
public:
B( const B& another)
{
}
};
调用: B obj1;
B ojb2= obj1; //拷贝构造
如果A中有指针成员,A的拷贝构造代码里也做了深拷贝。
但是B的构造函数代码并没有对继承过来的指针成员做深拷贝, B的拷贝构造所做的工作仅仅是:
对B类新增加的数据成员做处理, A的成员它不管, B的拷贝构造只提供了处理B新增加的数据成员的代码,
那么此时 B obj2=obj1; 能否获得我们需要的正确结果呢?
我说 "自定义复制构造函数的话,需要自己调用。" 是这个意思。
class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
原来如此,多谢
那10楼中提到的:
么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
对不? 感觉不对啊, 这样太麻烦了啊, 呵呵。