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)"