简述虚基类和虚函数的区别,可结合例子说明(二义性&多态性)
时间: 2023-07-16 22:12:16 浏览: 178
虚基类和虚函数都是C++中实现多态性的机制,但是它们的作用和应用场景是不同的。
虚基类指的是在多重继承中,如果某个类在继承关系中被多次继承,那么从该类派生出的子类中就会存在多个该类的实例。为了解决这种问题,可以将该类设计为虚基类,这样在派生类中只会存在一个该类的实例。虚基类通常没有自己的对象,只起到协调作用。
下面是一个简单的例子:
```
class Base {
public:
int value;
};
class Derived1 : virtual public Base {
public:
void func1() {
value = 1;
}
};
class Derived2 : virtual public Base {
public:
void func2() {
value = 2;
}
};
class Derived3 : public Derived1, public Derived2 {
public:
void func3() {
value = 3;
}
};
int main() {
Derived3 d3;
d3.func1();
d3.func2();
d3.func3();
cout << d3.value << endl;
return 0;
}
```
在这个例子中,我们定义了一个基类`Base`和三个派生类`Derived1`、`Derived2`和`Derived3`。`Derived1`和`Derived2`都继承了`Base`,并且都是虚继承。`Derived3`同时继承了`Derived1`和`Derived2`。在`main`函数中,我们创建了一个`Derived3`的对象,并且依次调用了它的三个成员函数。由于`Base`是虚基类,所以`Derived3`中只会存在一个`Base`的实例,而不是两个。最后输出的结果是3。
虚函数指的是在基类中声明一个虚函数,在派生类中可以重新定义该函数。当使用基类指针或引用调用该函数时,会根据指向的对象类型动态地调用相应的函数。这样可以实现运行时多态性,也就是说在程序运行时才决定调用哪个函数。具体的实现机制是通过虚函数表来实现的。
下面是一个简单的例子:
```
class Base {
public:
virtual void func() {
cout << "This is the base class" << endl;
}
};
class Derived1 : public Base {
public:
void func() override {
cout << "This is the first derived class" << endl;
}
};
class Derived2 : public Base {
public:
void func() override {
cout << "This is the second derived class" << endl;
}
};
int main() {
Base* ptr;
Derived1 d1;
Derived2 d2;
ptr = &d1;
ptr->func();
ptr = &d2;
ptr->func();
return 0;
}
```
在这个例子中,我们定义了一个基类`Base`和两个派生类`Derived1`和`Derived2`,它们都重写了`Base`中的`func`函数。在`main`函数中,我们定义了一个指向`Base`类型的指针`ptr`,并且依次让它指向`d1`和`d2`。当我们通过`ptr->func()`调用`func`函数时,由于`func`是虚函数,程序会根据指向的对象类型动态地调用相应的函数。最后输出的结果是:
```
This is the first derived class
This is the second derived class
```
总的来说,虚基类和虚函数都是实现多态性的机制,但是应用场景和作用是不同的,虚基类用于解决多重继承中的二义性问题,而虚函数则实现了运行时多态性。
阅读全文