C++ 相同命名的继承函数和重写的虚拟函数之间有什么区别? #包括 使用名称空间std; 阶级基础 { 公众: void f(){cout

C++ 相同命名的继承函数和重写的虚拟函数之间有什么区别? #包括 使用名称空间std; 阶级基础 { 公众: void f(){cout,c++,class,inheritance,virtual,overriding,C++,Class,Inheritance,Virtual,Overriding,关键是获取。如果基类中的函数声明为虚函数,而派生类重写它,则如果使用基类指针调用函数,它将自动调用派生类中的函数。如果它不是虚函数,则它将调用基类函数 其基本思想是,您可以这样做: #include <iostream> using namespace std; class base { public: void f() {cout << "base" << endl;} virtual void v() {cout &

关键是获取。如果基类中的函数声明为虚函数,而派生类重写它,则如果使用基类指针调用函数,它将自动调用派生类中的函数。如果它不是虚函数,则它将调用基类函数

其基本思想是,您可以这样做:

#include <iostream> 
using namespace std;  

class base  
{  
public:  
    void f() {cout << "base" << endl;}  
    virtual void v() {cout << "base (virtual)" << endl;}  


};  

class deriv : public base  
{  
public:  
    void f() {cout << "deriv" << endl;}  
    void v() {cout << "deriv (overridden)" << endl;}  
};  


int main()  
{  
    base b;  
    b.f();  
    b.v();  

    deriv d;  
    d.f();  
    d.v();  
}
类动物
{
公众:
虚拟空谈()=0;
};
犬类:公共动物
{
公众:

void talk(){cout只有在使用指针或引用时才能看到两者之间的差异

class Animal
{
    public:
    virtual void talk() = 0;
};

class Dog : public Animal
{
    public:
    void talk() { cout << "Bark" << endl; }
};

class Cat : public Animal
{
    public:
    void talk() { cout << "Meow" << endl; }
};

void foo(Animal* a)
{
    a->talk();
}
正如预期的那样。现在我们将此指针转换为基指针:

deriv * d = new deriv;
d->f(); // "deriv"
d->v(); // "deriv (overridden)"
base*b=static_cast(d);
b->f();/“基本”
b->v();/“deriv(已覆盖)”

虚拟函数调用将转到派生函数,即使指针是指向基类的指针。

gokoon,因此使格式化代码变得非常简单。标记代码,单击编辑框上方的
101010
按钮,就完成了。还有什么比这更简单的呢?如果要在Markdown和Textile之间展开讨论,请是的。只是为了完整起见,引用也有同样的效果。@doron,我在第一句话中就说过了。当然,很容易漏掉。
base * b = static_cast<base *>(d);
b->f(); // "base"
b->v(); // "deriv (overridden)"