当前位置: 首页 > 知识库问答 >
问题:

抽象基类中私有虚拟函数的可见性

仉嘉泽
2023-03-14

请考虑以下代码:

class A {
public:
  virtual void f() const = 0;
  void callf() const { f(); }
};

class B : public A {
  virtual void f() const { }
};

int main()
{
  B x;
  x.callf();

  return 0;
}

B派生自抽象基类A,但“隐藏”实现的方法f()作为私有成员。尽管如此,继承的成员allf()能够调用f(),这在基类中是公共的。代码在g 10.1.0和clang 11.1.0编译时没有警告。

这是一个合法的代码吗,即继承的callf()是否正确地看到私有成员f()

或者,派生类< code>B是否可以实现基类的纯虚拟方法,这样它们只能由< code>B(和友元)调用?

共有1个答案

严开宇
2023-03-14

这是合法的代码吗,即继承的callf()是否正确地看到私有成员f()?

是的,这是法典。从编译器的角度来看,callf 函数引用了自己类的 f 函数;这是一个虚函数的事实不会影响范围(或可访问性)——只影响实现,它将以调用 V-table 条目的形式出现。该向量表条目将在运行时通过派生类调用时被正确解释。

 类似资料:
  • 这个类会被认为是一个抽象类,因为它有一个虚拟函数吗?我仍然能够创建一个动物对象并调用getFood成本(); 我认为抽象类不能被实例化,这是否意味着对象可以具有虚拟功能而不被认为是抽象类?

  • 问题内容: 在Java中,在抽象类中使用私有构造函数的目的是什么? 在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数? 我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。 也许还有更优雅的用法? 问题答案: 如果构造函数是类的 唯一 构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不

  • 我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?

  • 在 C++中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) = 0; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上 ,表明此函数为纯虚函数。 最后的 并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。 包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。

  • 我试图理解为什么在谈到构造函数时,类成员的可访问性之间存在差异。 考虑下面的例子: 的私有成员作为私有成员,不应从访问。对于字段和方法,情况确实如此,但构造函数似乎没有遵循相同的规则。 从JLS-8(6.6.1.确定可访问性)中,我们可以阅读: [...] 引用类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且声明该成员或构造函数允许访问时才可访问: > [……] 否则,成员或

  • 我想强制我的抽象类孩子实现我的抽象方法为私有。这可能吗?