C++/CLI类函数重写规则的一些例子

来源:互联网 发布:apache cacti安装配置 编辑:程序博客网 时间:2024/05/17 22:54
  1. /*
  2. (C) EnzoYang 2008
  3. Filename    : testoverride.cpp
  4. Compiler    : Visual C++ 9.0 / Visual Studio 2008
  5. Description : test about C++/CLI override
  6. Release     : 11/30/2008 1.0
  7. */
  8. #include "stdafx.h"
  9. using namespace System;
  10. ref class B abstract
  11. {
  12. public:
  13.     virtual void fun() abstract;
  14.     virtual void f() abstract;
  15.     virtual void error() {System::Console::WriteLine(L"myerror");};
  16. };
  17. interface class IB
  18. {
  19.     void fun();
  20. };
  21. ref class D: B, IB
  22. {
  23. public:
  24.     virtual void fun1()  = B::fun  //重写了B::fun
  25.     {
  26.         System::Console::WriteLine(L"b::fun");
  27.     }; 
  28.     virtual void fun2() = IB::fun  //重写了IB::fun
  29.     {
  30.         System::Console::WriteLine(L"ib::fun");
  31.     }; 
  32.     virtual void f() override 
  33.     { 
  34.         System::Console::WriteLine(L"f");
  35.     };
  36.     virtual void fun() new //与上面的重写无冲突
  37.     { 
  38.         System::Console::WriteLine(L"hello");
  39.     };  
  40.     virtual void error() new = B::error //正确 但是error依然是重写了B::error
  41.     { 
  42.         System::Console::WriteLine(L"error");
  43.     }; 
  44.     //***1***virtual void error() new { System::Console::WriteLine(L"error");};     
  45.     //正确 error只是隐藏了 B::error
  46.     //virtual void error() override = B::error  { System::Console::WriteLine(L"error");};    
  47.     //错误 ,error 不能被多次重写,这里显式和隐式各一次了
  48.     //virtual void error() override = B::error  { System::Console::WriteLine(L"error");};    
  49.     //错误同上
  50. };
  51. int main(array<System::String ^> ^args)
  52. {
  53.     //String sstr;
  54.     D^ d = gcnew D;
  55.     d->fun();
  56.     d->fun1();
  57.     d->fun2();
  58.     d->f();
  59.     B^ b = d;
  60.     b->fun();
  61.     b->error(); // 这里的输出是error 如果用注释中的***1***那条语句的话输出时myerror
  62.     IB^ ib = d;
  63.     ib->fun();
  64.     String ^str = Console::ReadLine();
  65.     return 0;
  66. }

输出结果

hello

b::fun

ib::fun

f

b::fun

error

ib::fun

原创粉丝点击