- 论坛徽章:
- 0
|
C++中三种virtual 用法
1. C++中可以通过virtual实现虚拟继承和虚拟函数
2. 虚拟继承和虚拟函数没有任何关系
3. 虚拟继承的用法如下
在多重继承的时候会用到虚拟继承的特性
class a
{
public:
void Set_i(int i)
{
j = i ;
}
//…
protected:
int j ;
};
class a1 : virtual public a
{
// ...
};
class a2 : virtual public a
{
// ...
} ;
当有
class b:public a1,public a2
{
public:
b():a1(),a2()
{
}
// ...
}
这样的多重继承时,将会保证只有一个a对象被实例化,从类b对象对j的访问也不会出现编译异常
4. 虚函数的使用
用来实现多态性(确定一个函数调用来自父类还是子类)
虚函数有函数体,即定义
class a
{
public:
virtual void f()
{
//...
}
// ...
};
class a1 :public a
{
public:
virtual void f()
{
//...
}
// ...
};
void f2(a& b)
{
b.f() ;
}
当有:
void main()
{
a a_impl ;
a1 a1_impl ;
test(a_impl) ;
test(a1_impl) ;
}
对b.f()的调用,当看到virtual时,会在运行时刻(而不是编译时)根据对象的不同分别调用类a1对象或者类a对象的f()方法,这称为迟后联编
5.纯虚函数
虚函数=0
纯虚函数没有定义,只有被继承的时候被实现
纯虚函数一般用来构造抽象类
有纯虚函数的类是抽象类,抽象类可以有非纯虚函数,抽象(或只要有一个纯虚函数的类)只能用来继承
class a
{
public:
virtual void f()=0 ;
// ...
};
虽然抽象类不能用来实例化,但可以声明它的指针或引用,如:
void f(a *a_ptr) 或 void f(&a)
{ {
} }
实际使用时,可以传递其实例化的子类
f(&a) 或 f(a *a_prt) |
|