class Base
{
virtual void bePolymorphic() = 0; // Will never be used
};
class Derived : Base
{
virtual void bePolymorphic() override {}; // I have to do this in every derived class
};
如果Base没有任何成员函数的话,这就是我最近使用的使它成为抽象类的黑客攻击。
在Java中有一个abstract关键字。为什么C++里没有一个?还有其他方法使类抽象吗?
我试着理解在退出范围时析构函数调用的顺序。假设我有以下代码:
class Parent{
Parent(){cout<<"parent c called \n";}
~Parent(){cout<< "parent d called \n";}
};
class Child: public parent{
Child(){cout<< "child c called \n";}
~Child(){cout<<"child d called\n";}
};
现在,我知道子构造函数
接口需要虚拟析构函数,还是自动生成的?例如,下面两个代码段中哪一个是最好的,为什么呢?请注意,这是全班学生。在Java语言中,没有其他方法、变量等,这是一个“接口”.
class Base
{
public:
virtual void foo() = 0;
virtual ~Base() {}
};
或者..。
class Base
{
public:
virtual void foo() = 0;
~Base() {} // This line can be omitted, but included for clarity.
};
编辑由于“不是我想要的”答
我理解为什么会发生这种情况,但是当我的程序退出时,我的代码在生成错误(从而导致崩溃)时,我的代码一直在努力解决it...here。
pure virtual method called
SomeClass::~SomeClass()
{
BaseClassObject->SomePureVirtualMethod(this);
}
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
//Do stuff to remove obj from a collection
}
我从来没有调用过new SomeCl
但是在后台发生了什么呢?
我的意思是一个子类继承了它的基类的这个虚拟析构函数。继承某些东西对我来说意味着获得它的原样。但在这种情况下,子类不会获得基类所具有的析构函数。(也许它会变得一样,特别是如果它没有身体的话)。关键是,即使子类没有重新定义它,它也会做其他事情。那么这是如何工作的呢?
假设我们有(C++):
class BaseClass{
int i;
public:
virtual ~BaseClass(){}
};
class SubClass: public BaseClass{
int j;
};
BaseClass* bptr = new SubClass;
根据准则:
如果需要默认析构函数,但其生成已被抑制(例如,通过定义移动构造函数),则使用=default。
我无法想象在类中,如果没有显式默认析构函数,代码什么时候会出现错误,而类中有移动构造函数。
有人能给我举个例子证实上面的话吗?
struct S {
S() {};
S( S&& ) {}; // move ctor
};
int main() {
S s; // there is no need to declare dtor explicitly =default
}