观察(检查):相同的成员函数名,不同的签名,一个是virtual member
Observation (check): same member function name, different signature, one as virtual member
恐怕这是不可能的:
class A {
public:
A(){}
virtual string s() = 0
string s(int i) {
auto j = this->s();
... modify j ...
return j;
};
class B: public A{
public:
B() : A() {}
string s() override {
return string("Class B"); // just some string
}
};
换句话说:你不能有两个成员函数变体,其中一个是虚拟的?这个观察正确吗?
您可以在基础和派生 classes 中使用同名的虚函数和非虚函数。
在你的问题中 classes 的例子中,派生的虚函数 s 的定义 class B 隐藏了基类中声明的同名非虚函数 class A.
string s() override {
return string("Class B"); // just some string
}
要使其在派生范围内可见 class,您可以使用 using 声明。
这里有一个演示程序。
#include <iostream>
#include <string>
int main()
{
struct A
{
std::string f( int i ) const
{
return f() + '(' + std::to_string( i ) + ')';
}
virtual std::string f() const
{
return "struct A";
}
virtual ~A() = default;
};
struct B : A
{
using A::f;
virtual std::string f() const override
{
return "struct B";
}
};
B b;
std::cout << b.f( 1 ) << '\n';
A &rb = b;
std::cout << rb.f( 2 ) << '\n';
A a;
std::cout << a.f( 3 ) << '\n';
}
程序输出为
struct B(1)
struct B(2)
struct A(3)
恐怕这是不可能的:
class A {
public:
A(){}
virtual string s() = 0
string s(int i) {
auto j = this->s();
... modify j ...
return j;
};
class B: public A{
public:
B() : A() {}
string s() override {
return string("Class B"); // just some string
}
};
换句话说:你不能有两个成员函数变体,其中一个是虚拟的?这个观察正确吗?
您可以在基础和派生 classes 中使用同名的虚函数和非虚函数。
在你的问题中 classes 的例子中,派生的虚函数 s 的定义 class B 隐藏了基类中声明的同名非虚函数 class A.
string s() override {
return string("Class B"); // just some string
}
要使其在派生范围内可见 class,您可以使用 using 声明。
这里有一个演示程序。
#include <iostream>
#include <string>
int main()
{
struct A
{
std::string f( int i ) const
{
return f() + '(' + std::to_string( i ) + ')';
}
virtual std::string f() const
{
return "struct A";
}
virtual ~A() = default;
};
struct B : A
{
using A::f;
virtual std::string f() const override
{
return "struct B";
}
};
B b;
std::cout << b.f( 1 ) << '\n';
A &rb = b;
std::cout << rb.f( 2 ) << '\n';
A a;
std::cout << a.f( 3 ) << '\n';
}
程序输出为
struct B(1)
struct B(2)
struct A(3)