c++含有纯虚函数的虚基类是否能构造?

前言

笔者工作中有很多类派生自一个虚基类,但是这些派生类又有很多操作是大致相同,尤其是这些类都不能拷贝,所以需要删除拷贝构造函数拷贝赋值运算符。最直接的想法是在虚基类里面删除拷贝构造函数拷贝赋值运算符。但我想因为虚基类不能实例化,那是否可以定义常规构造函数移动构造函数移动赋值运算符呢?经过验证得到了答案。

结果

  1. 虚基类定义常规构造函数移动构造函数移动赋值运算符,能删除拷贝构造函数拷贝赋值运算符
  2. 因为是虚基类,含有未实现纯虚函数,故不能被外部(非派生类)直接实例化,但能被派生类实例化。派生类构造时能调用虚基类的构造函数。
  3. 需要注意的是,因为虚基类删除了拷贝构造函数和拷贝赋值运算符,则需要手动定义所需构造函数(派生类需要用到的),否则编译不通过。派生类可以不定义构造函数来让编译器生成默认构造函数,否则需要手动定义出构造函数。这点值得进一步讨论

示例代码

#include <atomic>
#include <thread>
#include <functional>
#include <iostream>
#include <map>
#include <unordered_map>
#include <memory>
#include <mutex>

class Interface {
public:
    Interface() {
        std::cout << "Interface::Interface() " << this << std::endl;
    }

    Interface(Interface&&) {
        std::cout << "Interface::Interface(&&) " << this << std::endl;
    }

    Interface& operator = (Interface&&) {
        std::cout << "Interface::operator = () " << this << std::endl;
        return *this;
    }

    Interface(const Interface&) = delete;
    Interface& operator = (const Interface&) = delete;

    virtual ~Interface() {
        std::cout << "Interface::~Interface() " << this << std::endl;
    }

    virtual void VirtualFunc() = 0;
};

class Base : public Interface {
public:
    /*
    // 让编译器自动生成
    Base() {
        std::cout << "Base::Base()" << std::endl;
    }

    ~Base() {
        std::cout << "Base::~Base()" << std::endl;
    }
    */

    virtual void VirtualFunc() {
        std::cout << "Base::VirtualFunc " << this << std::endl;
    }

private:
    std::string s_;
};

int main(int argc, char* argv[]) {
    Base b;
    Base xx = std::move(b);
    // Base cc = b; //无法编译通过,拷贝已删除

    b.VirtualFunc();
    xx.VirtualFunc();

    return 0;
}

运行结果

Interface::Interface() 000000C69F0FF9E8
Interface::Interface(&&) 000000C69F0FFA38
Base::VirtualFunc 000000C69F0FF9E8
Base::VirtualFunc 000000C69F0FFA38
Interface::~Interface() 000000C69F0FFA38
Interface::~Interface() 000000C69F0FF9E8

结尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值