为什么 abstract base class 需要显式默认构造函数?
Why does abstract base class need explicit default constructor?
对于下面的代码,
#include <iostream>
class virtualBase {
public:
virtual void printName() = 0;
// virtualBase() = default;
private:
virtualBase(const virtualBase &) = delete; // Disable Copy Constructor
virtualBase &
operator=(const virtualBase &) = delete; // Disable Assignment Operator
};
class derivedClass : public virtualBase {
public:
void printName() { std::cout << "Derived name" << std::endl; };
derivedClass() {};
~derivedClass() = default;
};
int main() {
derivedClass d;
d.printName();
return 0;
}
我需要取消注释基 class 中的默认构造函数定义才能使编译成功。
我看到以下编译错误:
test.cpp: In constructor ‘derivedClass::derivedClass()’:
test.cpp:18:18: error: no matching function for call to ‘virtualBase::virtualBase()’
18 | derivedClass() {};
| ^
test.cpp:10:3: note: candidate: ‘virtualBase::virtualBase(const virtualBase&)’ <deleted>
10 | virtualBase(const virtualBase &) = delete; // Disable Copy Constructor
| ^~~~~~~~~~~
test.cpp:10:3: note: candidate expects 1 argument, 0 provided
我的理解是,编译器提供了它自己的默认构造函数,尤其是在这种 class 非常简单的情况下。
我在这里错过了什么?
谢谢
显式声明任何构造函数会阻止隐式默认构造函数的声明。
您明确声明了复制构造函数(即使您随后将其定义为已删除)。
对于下面的代码,
#include <iostream>
class virtualBase {
public:
virtual void printName() = 0;
// virtualBase() = default;
private:
virtualBase(const virtualBase &) = delete; // Disable Copy Constructor
virtualBase &
operator=(const virtualBase &) = delete; // Disable Assignment Operator
};
class derivedClass : public virtualBase {
public:
void printName() { std::cout << "Derived name" << std::endl; };
derivedClass() {};
~derivedClass() = default;
};
int main() {
derivedClass d;
d.printName();
return 0;
}
我需要取消注释基 class 中的默认构造函数定义才能使编译成功。
我看到以下编译错误:
test.cpp: In constructor ‘derivedClass::derivedClass()’:
test.cpp:18:18: error: no matching function for call to ‘virtualBase::virtualBase()’
18 | derivedClass() {};
| ^
test.cpp:10:3: note: candidate: ‘virtualBase::virtualBase(const virtualBase&)’ <deleted>
10 | virtualBase(const virtualBase &) = delete; // Disable Copy Constructor
| ^~~~~~~~~~~
test.cpp:10:3: note: candidate expects 1 argument, 0 provided
我的理解是,编译器提供了它自己的默认构造函数,尤其是在这种 class 非常简单的情况下。
我在这里错过了什么?
谢谢
显式声明任何构造函数会阻止隐式默认构造函数的声明。
您明确声明了复制构造函数(即使您随后将其定义为已删除)。