当一个基类中具有相同的函数名,并且每个函数的代码都不相同时,是否需要将我的函数设置为虚拟,还是仅仅是更好的编程的一部分?虚拟成员函数的必要性
1
A
回答
3
根本没有必要使方法变为虚拟。但是,如果您希望通过“后期绑定”来调用它,那么它应该是虚拟的,即,如果给定基本指针,您希望调用派生方法。
如果您不希望发生这种情况,通常是因为这些方法不相关,在这种情况下,您最好为派生类中的方法指定一个不同的名称。
0
虚拟函数的调用在运行时动态调度。这是多态性的基础。
在基类中声明为虚拟的函数在子类中将隐式地为虚拟。
0
0
如果您希望使用派生类实例的基类指针,并且函数具有相同的签名,那么您可能需要使函数virtual
以及使类的析构函数为virtual
。这样,如果某人有父类指向派生类型的指针,并且他们想要调用该函数,那么他们可能会想要执行子类的版本(如果它不同于父类的)。
class Parent
{
public:
virtual ~Parent() {}
virtual void doSomething()
{
std::cout << "Parent";
}
};
class Child : public Parent
{
public:
virtual ~Child() {}
virtual void doSomething()
{
std::cout << "Child";
}
};
int main()
{
Parent *p = new Child();
p->doSomething(); // prints "Child" because of dynamic dispatch
}
0
class A {
public:
void Foo() {}
virtual void Bar() {}
};
class B : public A {
public:
void Foo() {}
virtual void Bar() {}
};
int main() {
A *a = new A;
B *b = new B;
A *c = b;
a->Foo(); // calls A::Foo on a
b->Foo(); // calls B::Foo on b
c->Foo(); // calls A::Foo on b
a->Bar(); // calls A::Foo on a
b->bar(); // calls B::Foo on b
c->bar(); // calls B::Foo on b
delete a;
delete b;
}
相关问题
- 1. 继承和虚拟成员函数
- 2. 多态性/继承问题与虚拟类的成员函数
- 3. C++从父虚拟成员调用子虚拟成员
- 4. 具有相同名称的虚拟成员函数的继承
- 5. 包含虚拟成员函数的类的大小
- 6. 虚拟非方法成员
- 7. 语法虚拟成员
- 8. 演员派生虚拟覆盖基地纯虚拟成员
- 9. 指向虚拟成员函数的指针是否可比?
- 10. C++成员函数的虚拟覆盖和过载,同时
- 11. 构造函数中的虚拟成员调用
- 12. 默认情况下是虚拟的成员函数吗?
- 13. 虚拟成员函数的打印地址
- 14. 当模板类的虚拟成员函数实例化了吗?
- 15. 虚拟基类数据成员
- 16. 向属性赋值时在构造函数中调用虚拟成员
- 17. 如何在C++中正确使用虚拟成员函数
- 18. 编写非虚拟条件成员函数是否安全?
- 19. 虚拟析构函数 - 有需要时
- 20. 嘲笑Moq中的虚拟成员
- 21. 虚继承和函数成员
- 22. d成员函数属性
- 23. 虚拟函数C#
- 24. 虚拟函数C++
- 25. C#中虚拟基类方法/成员的属性继承
- 26. 空的构造函数的必要性
- 27. C++继承:虚拟成员需要重新声明?
- 28. 需要虚拟模板成员解决方法
- 29. C++:重写纯虚拟成员变量?
- 30. 虚拟继承成员查询
你的函数是否也有相同的签名? – EnabrenTane 2010-12-19 19:59:50
也许吧。它可能不应该是虚拟的。无法从您的问题中获知。 Google'多态性'。 – 2010-12-19 20:03:52