从C#到C++的一些容易出现的困惑(2)

1: #ifndef _BASEGAME_H

2: #define _BASEGAME_H

3:

4: namespace WuguiEngine

5: {

6:     //前置声明

7:     class IUpdatable;

8:

9:     //前置声明

10:     namespace Graphics

11:     {

12:         class GraphicsDevice;

13:     }

14:

15:     //前置声明

16:     namespace Core

17:     {

18:         class TimeUsed;

19:     }

20:

21:     //简化的写法,GraphicsDevice可以在下面的代码中直接使用

22:     //GraphicsDevice与WuguiEngine::Graphics::GraphicsDevice等价

23:     //注意:如果不加上下面这行,WuguiEngine::Graphics不能省略

24:     using Graphics::GraphicsDevice;

25:

26:     class BaseGame : virtual public IDisposed,

27:         virtual public IRenderable

28:     {

29:         // add definition

30:     }

31: }

32:

33: #endif

上面的代码简单的说明了namespace的一些基本的用法,该段代码取自BaseGame.H的文件,在class BaseGame中,用到了来自不同的命名空间下的IUpdatable, GraphicsDevice等类.具体的内容可以先看看代码里面的注释

在需要在BaseGame.H中包含这些类的头文件的同时,需要加上这些类的前置声明,如果不加会出现一些诡异的编译错误(有些问题可能也是在于我比较不了解c++),反正我觉得使用using namespace ...并不是一个很好的做法,不如using XXX::YYY::ZZZ来得准确(这里也希望高手来拍砖指点一下.

3.继承

1)virtual继承

在继承接口(只具有纯虚函数的类)的时候最好为继承的方法加上virtual的说明(参考上面一段的代码,IUpdatable与IDisposed就是接口,主要的原因是在于c++的多重继承机制,假如A与B都继承自IInterface,C又继承自A,B,那么普通的继承方式则会在C类中保存两个IInterface的副本.

而virtual继承就有区别了,virutal继承告诉编译器:"我继承的是一个纯接口!",这样只会保存一个副本.

2)多种继承方式

大家知道,C++对于继承的方式有很多的修饰,有public, private, protected,而且还可以加入virtual关键字.在c++中,public继承与在c#中的继承是没有区别的,而其他几种继承是具有理论的价值,而实际中的应用得非常非常的少,这里就不再赘述了.

3)实验:重写虚函数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpswp.html