C++虚拟定义是否自动继承?
Is C++ virtual definition inherited automatically?
C++虚定义是递归的吗?考虑
class Foo
{
public:
virtual void a()=0;
};
class Bar:public Foo
{
public:
void a()
{
//...
}
};
如果我现在继承Bar
并再次重载a
,那a
是不是也是多态的?
递归意味着
Given a class A
that has a virtual member a
, and a virtual member of the n
:th subclass of A
, then a
is also a virtual member of the n+1
:th subclass, for all n
.
即虚函数遵循Peanos归纳公理,一级后不终止。
如果您继承自 Bar
,您应该
class Bar:public Foo
{
public:
virtual void a() override
{
//...
}
};
所以你在这里说了关于 a()
的两件事:
- 该函数是虚函数,因此任何派生自
Bar
的函数都会将该函数视为虚函数
- 您正在从基础 class
Foo
覆盖函数 a
如 and 所述,Bar
中的 virtual
关键字是多余的,因为该函数将被视为 virtual
,因为它位于基础 class.但是,我倾向于使用 virtual
/override
的习惯,如我的示例所示,因此乍一看 class 就可以立即清楚如何使用此函数,而无需必须继承遗产。
"Recursive" 这个词不对;但是,是的,覆盖虚函数的函数本身就是虚函数。
具有 (i) 相同名称,(ii) 相同参数类型,以及 (iii) 基类和子类中的 相关 return 类型的任何函数在基础 class 中标记为 virtual
的 class 在子 class 中也将是虚拟的。
所以是的,void bar::a()
也是虚拟的。事实上,没有办法删除子 class 函数中的 virtual
-ness。
您的条款不准确。 重载 与具有相同名称但不同参数类型的函数有关。 递归 是一种控制流技术。 覆盖 是在子 class.
中重新实现基础 class 函数
在正常情况下,重写的虚函数本身就是虚函数。父 class 函数是虚拟的并不重要,因为您使用了 virtual
关键字,或者因为它自己的父函数是虚拟的。
需要注意的一件事是,当您 "hide" 一个函数与另一个同名但签名不同的函数时。该函数不是虚拟的!
class Foo
{
public:
virtual void a()=0;
};
class Bar:public Foo
{
public:
void a(); // virtual
};
class Baz1 : public Bar
{
public:
void a(); // also virtual
};
class Baz2 : public Bar
{
public:
void a(int); // not virtual!
};
C++虚定义是递归的吗?考虑
class Foo
{
public:
virtual void a()=0;
};
class Bar:public Foo
{
public:
void a()
{
//...
}
};
如果我现在继承Bar
并再次重载a
,那a
是不是也是多态的?
递归意味着
Given a class
A
that has a virtual membera
, and a virtual member of then
:th subclass ofA
, thena
is also a virtual member of then+1
:th subclass, for alln
.
即虚函数遵循Peanos归纳公理,一级后不终止。
如果您继承自 Bar
,您应该
class Bar:public Foo
{
public:
virtual void a() override
{
//...
}
};
所以你在这里说了关于 a()
的两件事:
- 该函数是虚函数,因此任何派生自
Bar
的函数都会将该函数视为虚函数 - 您正在从基础 class
Foo
覆盖函数
a
如 Bar
中的 virtual
关键字是多余的,因为该函数将被视为 virtual
,因为它位于基础 class.但是,我倾向于使用 virtual
/override
的习惯,如我的示例所示,因此乍一看 class 就可以立即清楚如何使用此函数,而无需必须继承遗产。
"Recursive" 这个词不对;但是,是的,覆盖虚函数的函数本身就是虚函数。
具有 (i) 相同名称,(ii) 相同参数类型,以及 (iii) 基类和子类中的 相关 return 类型的任何函数在基础 class 中标记为 virtual
的 class 在子 class 中也将是虚拟的。
所以是的,void bar::a()
也是虚拟的。事实上,没有办法删除子 class 函数中的 virtual
-ness。
您的条款不准确。 重载 与具有相同名称但不同参数类型的函数有关。 递归 是一种控制流技术。 覆盖 是在子 class.
中重新实现基础 class 函数在正常情况下,重写的虚函数本身就是虚函数。父 class 函数是虚拟的并不重要,因为您使用了 virtual
关键字,或者因为它自己的父函数是虚拟的。
需要注意的一件事是,当您 "hide" 一个函数与另一个同名但签名不同的函数时。该函数不是虚拟的!
class Foo
{
public:
virtual void a()=0;
};
class Bar:public Foo
{
public:
void a(); // virtual
};
class Baz1 : public Bar
{
public:
void a(); // also virtual
};
class Baz2 : public Bar
{
public:
void a(int); // not virtual!
};