Robin Chow's C++ Blog

 

[导入]C#学习系列之接口

  1. 典型的接口定义如下: interface IControl { void Paint(); }
  2. 接口可以从零或多个接口中继承,即,接口支持多继承。
  3. 接口可以包含一个或多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。
  4. 接口成员默认访问方式是 public。接口成员声明不能包含任何修饰符,比如成员声明前不能加 abstrace,public,protected,internal,private,virtual,override 或 static 修饰符。
  5. 如果类实现了某个接口,类也隐式地继承了该接口的所有的父接口,不管这些父接口有没有在类声明的基类表中列出。接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其它接口的支持。

文章来源:http://my.donews.com/robinchow/2007/04/23/post-070423-115024-393/

posted @ 2007-10-23 20:45 Robin Chow 阅读(107) | 评论 (0)编辑 收藏

虚拟函数和重载

如下面的程序:

 1     #include < iostream >
 2 
 3     using namespace std;
 4 
 5     class base{
 6     public:
 7         virtual void f(char i){
 8             cout << "Base class: " << i << endl;
 9         };
10         virtual void f(double d){
11             cout << "Base class: " << d << endl;
12         }
13     };
14 
15     class derived : public base{
16     public:
17         void f(char i){
18             cout << "Derived class: " << i << endl;
19         }
20     };
21 
22     int main(int argc, char** argv)
23     {
24         base *pb = new derived;
25         pb->f(2.0);
26         delete pb;
27         return 0;
28     }
29 


开始的时候感觉有点迷惑,被调用的是 base 的 f 呢?还是 derived 的 f(需要进行参数类型转换)。实验证明,被调用的是 base 的 f。


因为重载是根据静态类型来选择函数的,亦即由 pb 本身的类型来决定。而虚拟则是根据动态类型来选择函数,由 pb 指向的对象类型决定。因此编译器首先根据重载来选择一个基类的函数,如果该函数为虚拟函数且被派生类实现,则再通过多态机制调用派生类函数。

posted @ 2007-01-13 14:42 Robin Chow 阅读(174) | 评论 (0)编辑 收藏

仅列出标题
共9页: 1 2 3 4 5 6 7 8 9 

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜