C ++虚拟定义是否自动继承?

时间:2015-05-08 14:54:48

标签: c++ polymorphism virtual

C ++虚拟定义是递归的吗?考虑

class Foo
     {
     public:
          virtual void a()=0;
     };

class Bar:public Foo
     {
     public:
         void a()
             {
         //...
             }
     };

如果我现在继承Bar并再次重载a,那么a也是多态的吗?

递归意味着

  

给定一个具有虚拟成员A的类a,以及n的{​​{1}}子类的虚拟成员,然后A为也是所有a的{​​{1}}:子类的虚拟成员。

也就是说,虚函数遵循Peanos感应公理,并且在一个级别之后不会终止。

4 个答案:

答案 0 :(得分:4)

如果您继承Bar,则应该

class Bar:public Foo
     {
     public:
         virtual void a() override
             {
         //...
             }
     };

所以你在这里说a()两件事:

  1. 该功能是虚拟的,因此从Bar派生的任何内容都会将该功能视为虚拟
  2. 您正在覆盖基类a
  3. 中的函数Foo

    提到@MikeSeymour@Bathsheba时,virtual中的Bar关键字是多余的,因为该函数将被视为virtual,因为它位于基础中类。但是,我倾向于习惯使用virtual / override,如我的例子中所示,所以很快就能清楚地看到这个函数如何在课堂上使用而不必走路继承。

答案 1 :(得分:4)

“递归”不是正确的词;但是,覆盖虚函数的函数本身就是虚函数。

答案 2 :(得分:4)

具有(i)相同名称,(ii)相同参数类型和(iii)相关的基本和子类中的相关返回类型的任何函数都标记为{{基类中的1}}在子类中也是虚拟的。

是的,par(mar=c(2.5, 4, 4, 4)+2) ## Plot first set of data and draw its axis barplot(data1$value, axes=FALSE,ylim=c(0,700000), xlab="", ylab="", col="black",space=-10,main="Work Score") axis(2, ylim=c(0,700000),col="black",las=1) ## las=1 makes horizontal labels mtext("Total Opportunity Amount",side=2,line=3.5) box() ## Allow a second plot on the same graph par(new=TRUE) ## Plot the second plot and put axis scale on right m <- barplot(counts, xlab="", ylab="", ylim=c(0,16000),axes=FALSE, col=c("red","darkblue"),space=3,width=0.5,density=20) ## a little farther out (line=4) to make room for labels mtext("Task Ratio: Outbound to AE",side=4,col="red",line=3.5) axis(4, ylim=c(0,16000), col="red",col.axis="black",las=1) 也是虚拟的。实际上,没有办法删除子类函数中的virtual - 。

您的条款不准确。 重载涉及具有相同名称但参数类型不同的函数。 递归是一种控制流技术。 重写是子类中基类函数的重新实现。

答案 3 :(得分:2)

在正常情况下,被覆盖的虚拟功能本身就是虚拟的。父类功能是否是虚拟的并不重要,因为您使用了print("-----ROCK, PAPER, SCISSORS-----") import random computer=random.randint(1,5) user=int(input("Enter Your Choice:\n1=Rock\n2=Paper\n3=Scissors\n4=Lizzard\n5=Spoc\n")) print("the computer has chosen",computer) if computer==user: print("Tie Game") elif computer==1 and user==3: print("Computer Wins") elif computer==2 and user==1: print("Computer wins") elif computer==3 and user==2: print("Computer wins") elif computer==4 and user==3: print("Computer wins") elif computer==4 and user==2: print("Computer wins") elif computer==4 and user==1: print("Computer wins") elif computer==5 and user==1: print("Computer wins") elif computer==5 and user==2: print("Computer wins") elif computer==5 and user==3: print("Computer wins") elif computer==5 and user==4: print("Computer wins") else: print("You win") 关键字,或者因为它自己的父级是虚拟的。

要注意的一件事是当你&#34;隐藏&#34;一个函数与另一个具有相同名称但签名不同的函数。该功能虚拟!

virtual