class Temp
{
private:
~Temp() {}
friend class Final;
};
class Final : virtual public Temp
{
public:
void fun()
{
cout<<"In base";
}
};
class Derived : public Final
{
};
void main()
{
Derived obj;
obj.fun();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码试图实现不可继承的类(final).但是使用上面的代码仍然可以创建派生的对象,为什么呢?
只有当ctor私有化时才能实现所需的功能,我的问题是为什么在dtor私有的情况下无法实现?
对于特定于类的new_handler实现,我在"有效的c ++"一书中遇到了以下示例.这看起来在多线程环境中存在问题,我的问题是如何在多线程环境中实现类特定的new_handler?
void * X::operator new(size_t size)
{
new_handler globalHandler = // install X's
std::set_new_handler(currentHandler); // handler
void *memory;
try { // attempt
memory = ::operator new(size); // allocation
}
catch (std::bad_alloc&) { // restore
std::set_new_handler(globalHandler); // handler;
throw; // propagate
} // exception
std::set_new_handler(globalHandler); // restore
// handler
return memory;
}
Run Code Online (Sandbox Code Playgroud) #include<iostream>
class base{
public:
base(){std::cout<<"In base";}
};
class dv1:virtual private base {
public:
dv1(){std::cout<<"In DV1";}
};
class dv2:virtual private base {
public:
dv2(){std::cout<<"In DV2";}
};
class drv : public dv1, public dv2 {
public:
drv() {std::cout<<"Why is this working";}
};
int main() {
drv obj;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不是在虚拟继承的情况下,调用构造函数是大多数派生类的责任吗?注意:这里基地是虚拟和私下继承的.
以下代码将编译但在运行时崩溃:
int main() {
try {
throw;
}
catch(...){
cout<<"In catch";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:"hello.exe中0x7c812a5b处的未处理异常:Microsoft C++异常:[rethrow] @ 0x00000000"
为什么编译器允许代码编译?编译器检查此代码是否是catch块的一部分看起来不是那么困难.