观察(检查):相同的成员函数名,不同的签名,一个是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)