C++中如何正确的定义一个接口类

接口类一般具有以下特征:
1.最好不要有成员变量,但可以有静态常量(static const)
2.要有纯虚接口方法
3.要有虚析构函数,并提供默认实现
class Testable
{
public:
    static const int START = 1;  // #1
    static const int STOP = 2;

    virtual void test() = 0;  // #2
    virtual ~Testable() {};   // #3
}

#1.

如果成员变量,尤其是可变的成员变量,定义在接口中,等于是把实现细节暴露出来了,不符合接口定义的要求,所以一般不在接口中定义可变的成员变量。
而常量可以定义在接口中,因为有时接口需要返回状态,而这些状态可以定义成常量放在接口中。

#2.

由于不能让接口类自身实例化,并且需要子类实现接口暴露的方法,所以接口方法都要声明成纯虚函数。
声明成虚函数意味着需要有子类来继承,声明成纯虚函数意味着接口类自身不需要提供方法的定义,并且使得接口类自身变成抽象类而不能实例化。

#3.

a. 在使用接口类的指针访问接口类的子类的实例时,当对接口类的指针做delete时,如果接口类的析构函数不是虚析构函数的话,将只会调用接口类的析构函数,接口类的子类的析构函数将不会被调用,内存泄露将会产生,所以接口类的析构函数必须定义成虚析构函数。
b. 如果接口类的析构函数不提供默认实现,即如果接口类的析构函数是纯虚析构函数的话,接口类的子类将被迫必须提供析构函数的实现,这样对接口类的子类不友好。
c. 在C++11中也可以用:  virtual ~Testable() = default; 替代 virtual ~Testable() {};


以上是定义C++接口类的一些重要事项,如果有错误或遗漏,请指正。

猜你喜欢

转载自blog.csdn.net/netyeaxi/article/details/80724557
今日推荐