纯虚函数(当我们设置时= 0)也可以有一个函数体.
如果它们根本不被调用,那么为纯虚函数提供函数体有什么用呢?
考虑:
struct device{
virtual void switchon() = 0 {}
};
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
我写了类似于以下的代码,它给出了一个错误:
函数定义编译的纯指定符因-Wfatal-errors而终止.
当我问他时,他向我展示了标准中的以下引用:
在类中声明的虚函数应在该类中定义或声明为纯(10.4),或两者兼有; 但不需要诊断(3.2).
我似乎无法理解这意味着什么,我认为这在某种程度上是不相关的.
PS:如果这不是相关的引用,请引导我到正确的引用,以便我可以有更好的反驳.
如果我有一个基类:
class Base {
public:
Base(){}
virtual void foo()=0;
};
Run Code Online (Sandbox Code Playgroud)
现在如果我从Base类中派生出任何类,它将不得不重写foo().
如果我也希望foo()Base类的行为怎么办?所以基类有它自己的foo,最重要的是,它的每一个都必须覆盖foo?那可能吗?
我想尝试这样的事情:
int main()
{
class Base
{
public:
Base() = default;
virtual void print() = 0;
void CallThread()
{
std::thread(&Base::print, *this);
};
};
class derived1 : public Base
{
public:
derived1() = default;
void print() { printf("this is derived1\n"); }
};
class derived2 : public Base
{
public:
derived2() = default;
void print() { printf("this is derived2\n"); }
};
Base* ptr;
ptr = new derived1();
ptr->CallThread();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想要的结果是:
这是派生的1.
问题是它甚至不会编译.我正在使用VisualStudio 2013.
错误是:
错误2错误C3640:'main :: Base :: [thunk]:__ thiscall …
我正在尝试声明纯虚拟析构函数,在VS2019中我这样写:
virtual ~A() = 0 {};
Run Code Online (Sandbox Code Playgroud)
很好,但是在Clion中,我接受了以下消息:
函数定义虚拟的纯说明符〜A()= 0 {};
并且迫使我为该函数编写不同的实现(不是给它带来很多麻烦,而是我想知道为什么会这样)