//转载 http://blog.csdn.net/boluo1982107/article/details/3239793 的一个例子 修改运行了下
using namespace std;
class base1
{
public:
void same_name_fun() ----------------------1,// virtual void same_name_fun()
{
cout<<"in base1 same_name_fun"<<endl;
}
virtual ~base1(){}
};
class base2
{
public:
void ba2_fun()
{
cout<<"base2_fun"<<endl;
}
};
class derived : public base1,base2
{
public:
void same_name_fun() ------------------------2,//virtual void same_name_fun()
cout<<"in derived same_name_fun"<<endl;
}
void de_fun()
{
cout<<"de_fun"<<endl;
}
};
int main()
{
derived * obj; // note: **1没有 new
obj->same_name_fun(); // ** 均加上virtual 关键字 ** Segmentation fault 去掉virtual 关键字 ok
(dynamic_cast<base1 *>(obj))->same_name_fun();
return 0;
}结果:
in derived same_name_fun
in base1 same_name_fun
1,2, 均加上virtual 关键字 **2 Segmentation fault 去掉virtual 关键字 ok .
#include <iostream>
using namespace std;
class base1
{
public:
void same_name_fun()
{
cout<<"in base1 same_name_fun"<<endl;
}
virtual ~base1(){}
};
class base2
{
public:
void ba2_fun()
{
cout<<"base2_fun"<<endl;
}
};
class derived : public base1,base2
{
public:
void same_name_fun()
{
cout<<"in derived same_name_fun"<<endl;
}
void de_fun()
{
cout<<"de_fun"<<endl;
}
};
int main()
{
derived obj;
obj.same_name_fun();
(static_cast<base1>(obj)).same_name_fun(); ** //(dynamic_cast<base1>(obj)).same_name_fun(); error: cannot dynamic_cast ‘obj’ (of type ‘class derived’) to type ‘class base1’ (target is not pointer or reference)
return 0;
}
运行结果:
in derived same_name_fun
in base1 same_name_fun
** 如果换成dynamic_cast会有error
正常的程序
#include <iostream>
using namespace std;
class base1
{
public:
void same_name_fun() //---------------------------1 加上virtual关键字 virtual void same_name_fun()
{
cout<<"in base1 same_name_fun"<<endl;
}
virtual ~base1(){}
};
class base2
{
public:
void ba2_fun()
{
cout<<"base2_fun"<<endl;
}
};
class derived : public base1,base2
{
public:
void same_name_fun() // ---------------------------2 加virtual关键字 virtual void same_name_fun()
{
cout<<"in derived same_name_fun"<<endl;
}
void de_fun()
{
cout<<"de_fun"<<endl;
}
};
int main()
{
derived * obj = new derived(); //note **1 有new关键字
obj->same_name_fun();
(dynamic_cast<base1 *>(obj))->same_name_fun();
return 0;
}
运行结果
in derived same_name_fun
in base1 same_name_fun
1 2都加virtual关键字运行结果
in derived same_name_fun
in derived same_name_fun