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

欢迎转载,转载请注明原文地址:https://blog.csdn.net/netyeaxi/article/details/80724557

 

C++中如何定义接口类?

首先给接口类下了定义:接口类应该是只提供方法声明,而自身不提供方法定义的抽象类。接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成。

而对于C++,其接口类一般具有以下特征:

1.最好不要有成员变量,但可以有静态常量(static const或enum)
2.要有纯虚接口方法
3.要有虚析构函数,并提供默认实现
4.不要声明构造函数

如下就是一个最简单的例子:

class Testable
{
public:
    static const int START = 1;  // #1
    static const int STOP = 2;

    virtual void test() = 0;  // #2: 接口方法

    virtual ~Testable() {};   // #3: 从C++11开始可以: virtual ~Testable() = default;
}

#1.

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

#2.

由于不能让接口类自身能够实例化,并且需要子类必须实现接口暴露的方法,所以接口方法都要声明成纯虚函数。
声明成纯虚函数意味着接口类自身不需要提供方法的定义,方法的定义需要由接口类的子类提供,并且接口类自身也因此变成了抽象类而不能被实例化。

#3.

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

#4.

不要显式定义任何的构造函数,但也不要在接口中加入如下代码来禁止生成构造函数:

	Testable() = delete;
	Testable(const Testable&) = delete;

因为C++的调用机制要求子类的构造函数调用时一定会先调用父类的构造函数,如果禁止生成构造函数,代码编译时会报错。如果程序员不显式的提供构造函数,编译器也会隐式的加上构造函数的,虽然这些构造函数对于接口类来说实际没有什么意义。

C++中如何定义标识接口(marker interface)类?

标识接口是没有任何方法和属性的接口。这种接口在java中出现的较多,比如:java.io.Serializable、java.rmi.Remote、java.util.EventListener、java.util.RandomAccess

实现代码如下:

class Testable {
public:
    virtual ~Testable() = 0 {}; // #5
};

#5.

只要对纯虚析构函数提供一个默认实现就可以了。这种对纯虚函数提供实现的写法看似很奇怪,但C++的确是支持的。

 

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

另外,对于如何正确的使用接口类,请参看下一篇文章“C++:如何正确的使用接口类”。

可以在C++定义一个私有接口类,可以使用嵌套类的方式来实现。 例如,假设我们有一个名为`MyClass`的类,它需要一个私有接口类来实现一些功能。我们可以在`MyClass`类的私有部分中定义一个嵌套类,如下所示: ```c++ class MyClass { private: class PrivateInterface { public: virtual void doSomething() = 0; virtual ~PrivateInterface() {} }; }; ``` 这里我们定义了一个名为`PrivateInterface`的嵌套类,它包含一个纯虚函数`doSomething()`,并且还实现了一个虚析构函数(因为我们使用了抽象基类)。 现在,我们可以将`PrivateInterface`的实现细节放到`MyClass`的私有部分中,以确保它只能在`MyClass`内部使用: ```c++ class MyClass { private: class PrivateInterface { public: virtual void doSomething() = 0; virtual ~PrivateInterface() {} }; class PrivateImpl : public PrivateInterface { public: void doSomething() override { // 实现细节 } }; }; ``` 在这个例子中,我们定义了一个名为`PrivateImpl`的嵌套类,它公开了`PrivateInterface`中声明的纯虚函数,并提供了它的实现细节。同时,`PrivateImpl`继承自`PrivateInterface`,这意味着我们可以使用`PrivateImpl`的实例来调用`doSomething()`函数。 注意,这个私有接口类只能在`MyClass`内部使用,因为它是`MyClass`的一个私有成员。在外部代码中,我们无法访问`PrivateInterface`或`PrivateImpl`,因为它们都是私有的。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值