这是什么基础:意味着什么?它是一个标准的c ++关键词

时间:2016-10-23 01:53:22

标签: c++

代码如下:

#include <iostream>

struct A {
    virtual void foo() { std::cout << "hello world!" << std::endl; }
};

struct B : public A {
    void foo() override { base:foo(); }
};

void main() {
    A* p = new B();
    p->foo();

    delete p;
}

什么是&#39;基础:&#39;手段?它是c ++中的标准关键词吗?

平台:win10 + vs2015 update3;

项目类型:win32控制台项目;

2 个答案:

答案 0 :(得分:6)

一种有些已知的习语会涉及类似

的内容
<div>@Model.someProperty</div>

你在那里看到的表面看起来很相似,但事实并非如此。在您的情况下,struct B : public A { typedef A base; void foo() override { base::foo(); } }; 只是一个标签,它什么都不影响。除非您提供的代码是故意的谜题/笑话,否则实际上可能是尝试重现我上面发布的内容,而这些内容并不是因为没有重新理解所有细节。

在任何情况下,base:都不是C ++中的关键字(也不是VS2015中的关键字)。

答案 1 :(得分:2)

VistaDBConnectionStringBuilder connStringBuilder = new VistaDBConnectionStringBuilder(); connStringBuilder.Password = "***"; connStringBuilder.DataSource = pathandFilenameTovdb5DB; connStringBuilder.Pooling = false; connStringBuilder.OpenMode = VistaDB.VistaDBDatabaseOpenMode.NonexclusiveReadWrite; DatabaseTarget dbt = new DatabaseTarget(); dbt.Name = "NLog Database"; dbt.DBProvider = "VistaDB.Provider.VistaDBConnection, VistaDB.5.NET40, Version=5.0.0.0, Culture=neutral, PublicKeyToken=dfc935afe2125461"; dbt.ConnectionString = connStringBuilder.ConnectionString; 不是C ++中的关键字。它只是一个没有特殊含义的普通标识符。

如果代码正是您向我们展示的内容,则base是一个转到标签 - 并且完全没有意义,因为没有引用它。您可以在base:之后(暂时)添加goto base;来自行演示。 (我只是自己尝试过,并没有得到任何额外的诊断。当然这将是一个无限循环。)

代码的作者可能并不打算将其作为goto标签,并且可能认为base:foo();会引用父类。也许basebase:的拼写错误(这可能是一个错误 - 也许base::是某种其他语言的关键字)?

无法确定作者的意图。使用base,这在C ++中是非法的(它需要void main())表明作者并不能很好地了解C ++。他或她可能试图做一些引用父类的东西,写得不正确,偶然发现了编写的东西。